我正在转换一些OpenGL ES 2.0代码,以便在不支持OpenGL ES 2.0但只支持标准OpenGL的标准桌面硬件上运行。
代码使用扩展名GL_EXT_shader_framebuffer_fetch
(以前称为GL_APPLE_shader_framebuffer_fetch
),它允许片段着色器通过以下方式读取“上一个”片段颜色:
mediump vec4 lastFragColor = gl_LastFragData[0];
这可用于进行自定义(即可编程)混合。
在OpenGL中是否存在相应的内容?
如果没有,我将不得不渲染到帧缓冲纹理,并将此纹理附加到渲染到它的相同片段着色器。
答案 0 :(得分:1)
虽然不是直接等效,但桌面OpenGL上的glTextureBarrier()(4.5中的核心,或通过ARB_texture_barrier / GL_NV_texture_barrier)允许(有一些限制)从附加到当前绑定的fbo的相同纹理中读取,同时渲染它。
所以,虽然GL_EXT_shader_framebuffer_fetch允许你做类似的事情
gl_FragColor = 0.5 * gl_LastFragData[0];
glTextureBarrier允许你做类似
的事情gl_FragColor = 0.5 * texelFetch(current_color_attachment, ivec2(gl_FragCoord.xy), 0);
两种方法都读取当前片段颜色,修改它然后再写回来。