2012-03-25 85 views
11

glTexImage2DglTexSubImage2D將像素緩衝區傳遞給紋理的唯一方法是什麼?使用glTexImage2D在OpenGL中更新紋理

在我的設置功能使用的那一刻glTexImage2D傳遞null作爲緩衝,然後在渲染循環我叫glTexSubImage2D在每個迭代新的緩衝區中的數據。

但知道紋理不會改變任何屬性,如尺寸,是否有更有效的方式將實際像素數據傳遞到渲染紋理?

回答

23

在現代OpenGL有4種不同的方法來更新2D紋理:

1)glTexImage2D - 最慢的一個,重新創建內部數據結構。

2)glTexSubImage2D - 有點快,但不能改變圖像的參數(大小,像素格式)。

3)渲染到紋理與FBO - 完全在GPU上更新紋理,速度非常快。請參閱此答案以獲取更多詳細信息:https://stackoverflow.com/a/10702468/1065190

4)像素緩衝區對象PBO - 用於從CPU到GPU的快速上載,在OpenGL ES上不支持(尚)。

+0

我看到FBO會是最好的選擇,但是,我的紋理需要使用GL_LUMINANCE參數,我只是發現FBO不支持這樣的。那麼是唯一的選擇使用glTexSubImage2D? – PerracoLabs 2012-11-07 10:27:53

+0

你使用桌面OpenGL還是OpenGL ES? – 2012-11-07 10:30:39

+0

在Android上使用OpenGL ES。使用GL_LUMINANCE的原因是我必須將YUV420sp數據傳遞給着色器,因爲我需要2次調用glTexSubImage2D來傳遞2個平面,一個用於Y,另一個用於UV。因此我必須使用GL_LUMINANCE。出於速度原因,將數據傳遞給着色器之前將YUV轉換爲RGB的選項不是一種選擇。 – PerracoLabs 2012-11-07 13:42:38