我想在OpenGL ES中逐像素渲染圖像。我想這樣做,因爲我計劃隨着時間推移這些像素以創建各種效果。呈現大量積分
對於性能和設計的原因,我決定用在兩個方向上只有每一個像素(從而減少其數量,以四分之一)
我只有OpenGL的非常基本的瞭解,所以我可能錯過了一些關鍵知識爲了達成這個。
達到此目的的最佳方法是什麼?我必須真正以像素爲單位渲染它嗎?或者我可以以某種方式創建紋理陣列的像素?
我想使盡可能多的設備儘可能這項工作(這樣的OpenGL ES 1.1的解決方案是較受歡迎的,但如果它是不可能的,或者這將是非常不方便或慢,2.0可以使用)
我試圖用VBO做到這一點,結果混雜。我不確定我是否做得很好,因爲存在一些問題(而且速度很慢)。這是我的代碼:
初始化:
glGenBuffers(1, &pointsVBO);
glBindBuffer(GL_ARRAY_BUFFER, pointsVBO);
glBufferData(GL_ARRAY_BUFFER, 160*240*sizeof(Vertex), 0, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
渲染:
- (void)renderPoints:(ImagePixel**)imagePixels {
int count = 160 * 240;
for(int i = 0; i < count; ++i) {
vertices[i].v[0] = imagePixels[i]->positionX;
vertices[i].v[1] = imagePixels[i]->positionY;
vertices[i].color[0] = imagePixels[i]->red;
vertices[i].color[1] = imagePixels[i]->green;
vertices[i].color[2] = imagePixels[i]->blue;
vertices[i].color[3] = 1;
}
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), vertices[0].v);
glColorPointer(4, GL_FLOAT, sizeof(Vertex), vertices[0].color);
// update vbo
GLvoid *vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, vertices, count * sizeof(Vertex));
glUnmapBufferOES(GL_ARRAY_BUFFER);
// draw contents of vbo
glDrawArrays(GL_POINTS, 0, count);
}
頂點結構:
typedef struct Vertex
{
float v[2];
float color[4];
} Vertex;
imagePixels陣列填充有來自圖像數據。
當我這樣做,我得到了我的大部分圖像,但我失去了最後幾行,我可以看到屏幕周圍的一些隨機像素。是否有可能在只使用部分數據的drawArrays中遇到一些限制?
第二個問題是,列的後半部分中的點未正確對齊。我想這是由於渲染本身時計算位置時浮點數學中的舍入誤差引起的(提供的座標都是2的倍數)。有什麼辦法可以防止這種情況發生?我需要將所有點都以適當的網格對齊。
我會盡快讓我的iphone爲您提供的屏幕截圖回
您是否考慮過像素緩衝區對象? (PBOs) –
我以前沒有聽說過他們:)我也會研究他們,謝謝 – Lope