2013-07-07 176 views
2

我正在将一些OpenGL ES 2.0代码转换为标准桌面硬件,该硬件不支持OpenGL ES 2.0,但只支持标准OpenGL。OpenGL等效于OpenGL ES 2.0的扩展GL_EXT_shader_framebuffer_fetch

该代码使用扩展GL_EXT_shader_framebuffer_fetch(以前称为GL_APPLE_shader_framebuffer_fetch),它允许所述片段着色器以通过读取“前”片段颜色:

mediump vec4 lastFragColor = gl_LastFragData[0]; 

这可以被用来定制做(即可编程)混合。

在OpenGL中有这样的等价物吗?

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

+1

你有什么需要这个,特别是?可能还有其他解决桌面OpenGL问题的方法。例如,我使用这个扩展来写出每片段的深度值,但是你可以直接在OpenGL中做这个,所以我能够使用它来重写我的着色器。 –

+0

是的,这就是我最初需要的原因,在我提出这个问题之后,我可以像你一样解决问题。不管怎么说,还是要谢谢你! – cheeesus

+1

*“如果不是这样,我将不得不渲染帧缓冲质地和重视这种纹理被渲染到它同片段着色器。” * - 这是行不通的,虽然。 –

回答

1

尽管不是直接等价的,但桌面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)​; 

两种方法读取当前的片段颜色,修改,然后将它写回。