OpenGL ES渲染到纹理绑定到着色器

时间:2014-12-19 20:31:51

标签: opengl-es

我可以渲染到相同的纹理,然后传递给我的着色器吗?

gl.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, currentTex, 0);

gl.glActiveTexture(GL_TEXTURE0);
gl.glBindTexture(GL_TEXTURE_2D, currentTex);
gl.glUniform1i(texGlId, 0);

// ...
// drawCall

2 个答案:

答案 0 :(得分:1)

不,你不应该这样做。 OpenGL规范将此称为#34;渲染反馈循环"。在某些情况下,您可以使用相同的纹理,例如,如果渲染到不用于纹理的mipmap级别。但是,如果使用纹理中包含的级别作为渲染目标,则行为未定义。

从ES 2.0规范的第80页开始,"渲染反馈循环":

  

当纹理附加到当前绑定的帧缓冲区对象的附着点时,可能会发生渲染反馈循环。在这种情况下,渲染结果是未定义的。具体条件详见4.4.4节。

答案 1 :(得分:0)

我们应该避免它。渲染结果将是未定义的,可能取决于GPU。

https://www.khronos.org/opengles/sdk/docs/man/xhtml/glFramebufferTexture2D.xml

  

注释

     

当纹理对象当前被绑定并可能被当前顶点或片段着色器采样时,需要采取特殊预防措施以避免将纹理图像附加到当前绑定的帧缓冲区。这样做可能导致在通过渲染操作写入像素和在当前绑定纹理中用作纹素时同时读取那些相同像素之间创建“反馈循环”。在这种情况下,帧缓冲区将被视为帧缓冲区完成,但在此状态下渲染的片段的值将是未定义的。纹理样本的值也可能未定义。