2014-02-24 57 views
1

OpenGL ES 2.0中可能重疊着色器效果嗎? (不使用FBO)Opengl ES 2.0中的重疊着色器效果

如何在不使用glReadPixels的情況下將着色器的結果與另一個着色器一起使用並再次推送已處理的像素?

下一個僞代碼是什麼我想要實現:

// Push RGBA pixels into the GPU 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pixels_To_Render); 

// Apply first shader effect 
glUseProgram(FIRST_SHADER_HANDLE); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Apply the second shader effect sampling from the result of the first shader effect 
glUseProgram(SECOND_SHADER_HANDLE); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

// Get the overall result 
glReadPixels(......) 
+0

是否有你想避免紋理支持FBO的原因?它們提供了一種相對簡單的方法,可以通過運行一個渲染過程完全在GPU上完成此操作,然後從下一個渲染過程中獲取所產生的紋理。這應該適用於幾乎所有的OpenGL ES 2.0設備。 –

回答

1

我相信你在談論的像素處理與片段着色?

使用OpenGL ES 2.0核心API,無法從目標幀緩衝區將像素從GPU讀取回片段着色器中。

但是,如果您的設備/平臺支持着色器framebuffer獲取擴展名(EXT_shader_framebuffer_fetch至少在iOS,NV_shader_framebuffer_fetch在其他地方),你很幸運。通過該擴展,片段着色器可以從目標幀緩衝區中讀取片段數據,並將其渲染到的片段(僅限片段)。這對於可編程混合或像素後處理效果非常好,因爲您不必承擔glReadPixels操作的性能損失。

聲明您使用的擴展名爲#extension GL_EXT_shader_framebuffer_fetch : require,然後從內置的gl_LastFragData[0]中讀取片段數據。 (下標用於渲染目標索引,但除非您使用OpenGL ES 3.0,否則您沒有多個渲染目標,因此它始終爲零。)按照您的喜好對其進行處理,然後像往常一樣寫入gl_FragColorgl_FragData