在Opengl ES 2.0中重叠着色器效果

时间:2014-02-24 15:37:20

标签: opengl-es textures shader

是否可以在OpenGL ES 2.0中重叠着色器效果? (不使用FBO)

如何使用另一个着色器着色器的结果而不必执行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(......)

1 个答案:

答案 0 :(得分:1)

我认为你在谈论使用片段着色器的像素处理?

使用OpenGL ES 2.0核心API,您无法将目标帧缓冲区中的像素放入片段着色器,而无需从GPU中读取它们。

但是,如果你的设备/平台支持着色器帧缓冲区获取扩展(至少在iOS上EXT_shader_framebuffer_fetch,在其他一些地方NV_shader_framebuffer_fetch),那么你很幸运。通过该扩展,片段着色器可以从目标帧缓冲区读取片段数据,以获取它所呈现的片段(并且只有该片段)。这对于可编程混合或像素后处理效果非常有用,因为您不必承担glReadPixels操作的性能损失。

声明您正在使用#extension GL_EXT_shader_framebuffer_fetch : require扩展,然后从gl_LastFragData[0]内置中读取片段数据。 (下标用于渲染目标索引,但除非您使用OpenGL ES 3.0,否则您没有多个渲染目标,因此它始终为零。)按照您的喜好处理它并写入gl_FragColor或{{像往常一样。}