2011-11-19 60 views
0

我想在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爲您提供的屏幕截圖回

+1

您是否考慮過像素緩衝區對象? (PBOs) –

+0

我以前沒有聽說過他們:)我也會研究他們,謝謝 – Lope

回答

2

如果你真的想要操縱的每一個像素,你應該只使用一個單一的全屏四在OpenGL和更新其質地各幀。

+0

紋理解決方案在我開始寫這篇文章後發生在我身上。我會試一試,看看它是如何工作的,謝謝 – Lope

+0

紋理解決方案很好,謝謝! – Lope

1

您可以使用glTexImage2D從像素的位圖數組中創建紋理。