2

我正在将一些 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 中是否有一个等价物?

如果没有,我将不得不渲染到帧缓冲区纹理并将此纹理附加到正在渲染到它的相同片段着色器。

4

1 回答 1

3

虽然不是直接等效的,但桌面 OpenGL(4.5 中的核心,或通过 ARB_texture_barrier/GL_NV_texture_barrier)上的 glTextureBarrier() 允许(有一些限制)从附加到当前绑定的 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)​;

两种方法都读取当前片段颜色,对其进行修改,然后将其写回。

于 2016-09-20T06:41:55.570 回答