2017-01-11 160 views
0

我需要使用Android上的OpenGL ES 2.0將動態變化像素渲染爲屏幕。將像素渲染爲紋理

我有一種方法可以產生寬度*高度的顏色數組(RGBA,4 * GLubyte)。另外還有PutPixel(x,y,color)方法,用於替換具有(x,y)座標的陣列中的像素顏色。

我的解決方案是:每個Draw()方法調用我調用BindTexture,glTexImage2D使用數組作爲紋理源,然後在完整的視口上渲染此紋理。

這是正確的方法嗎?或者有另一個更好的解決方案?

+0

看起來正確,但使用glTexSubImage2D可能更有意義。如果此方法每幀不會調用太多次,使用它可能實際上使您可以直接從PutPixel鉤住它。如果它被調用了很多次,那麼就應該將完整的緩衝區按照每個並條幀一次推送到紋理。 –

+0

我同意@MaticOblak一次渲染紋理並修改部分可能是一種更好的方法,以防你不更新屏幕上的所有內容。 但是,我不能拿出一個用例,你必須從CPU中每次繪製屏幕,​​從計算圖像中除去GPU。 也許你應該更深入地解釋用法。 – andras

回答

1

您的方法可能會產生足夠滿足您需求的性能,特別是如果您的寬度*高度小於全屏分辨率。它也有一個非常簡單的美德。

但是,一般來說,如果您可以在遊戲過程中減少CPU和GPU之間的傳輸大小,您將獲得更好的性能。

假設您從不需要讀取CPU上的像素顏色,並且通常只渲染每幀幾個像素,那麼最好的辦法可能是使用渲染到紋理方法。本質上你創建一個寬度*高度可渲染的紋理,並讓你的PutPixel函數在紋理中渲染彩色點(分批渲染以減少繪製調用)。

+0

謝謝,我瞭解FBO。但我應該如何將像素放在紋理上?是使用PutPixel(x,y,color){//綁定像素爲glDrawElements(GL_POINTS,1)的VBO的方式;}是一種好方法嗎? –

+0

GL_POINTS可能與任何方式一樣好,但我會使用glDrawArrays而不是glDrawElements(點的索引沒有用)。我也會將其批量化,以便儘可能少地進行繪製調用(理想情況下每幀只有一個調用)。 – Columbo

+0

不幸的是,PutPixel()被稱爲寬度*高度時間(對於每個像素)。然後調用Render()。有沒有比我的更好的解決方案? –