OpenGL中的自参考渲染缓冲区

OpenGL中的自参考渲染缓冲区,opengl,rendering,textures,Opengl,Rendering,Textures,我有一些OpenGL代码在不同的应用程序中表现不一致 硬件。我有一些代码: 创建渲染缓冲区并将纹理绑定到其颜色缓冲区(纹理a) 将此渲染缓冲区设置为活动,并调整视口等 激活像素着色器(在本例中为高斯模糊) 将四边形绘制为全屏,并在其上添加纹理 解除渲染缓冲等的绑定 在我的开发机器上,这工作得很好,并且达到了预期的效果 但是,在其他硬件上“就地”模糊纹理的效果 这似乎不起作用 我把它归结为两种可能性 A) 将renderbuffer渲染到自身不应该工作,并且 由于某种侥幸,只能在我的开发机器上工作

我有一些OpenGL代码在不同的应用程序中表现不一致 硬件。我有一些代码:

  • 创建渲染缓冲区并将纹理绑定到其颜色缓冲区(纹理a)
  • 将此渲染缓冲区设置为活动,并调整视口等
  • 激活像素着色器(在本例中为高斯模糊)
  • 将四边形绘制为全屏,并在其上添加纹理
  • 解除渲染缓冲等的绑定
  • 在我的开发机器上,这工作得很好,并且达到了预期的效果 但是,在其他硬件上“就地”模糊纹理的效果 这似乎不起作用

    我把它归结为两种可能性

    A) 将renderbuffer渲染到自身不应该工作,并且 由于某种侥幸,只能在我的开发机器上工作

    B) 这种方法应该是可行的,但还有一些地方出了问题

    有什么想法吗?老实说,我很难找到这个问题的具体细节。

    a)是正确的答案。从同一缓冲区读取时渲染到该缓冲区是未定义的。它可能会起作用,也可能不会——这正是正在发生的事情

    在OpenGL的例子中,有“4.4.3当绑定纹理对象的图像也附加到帧缓冲区时的渲染”一节,说明发生了什么(基本上,未定义)。在Direct3D9中,如果使用该设置,调试运行时会大声抱怨(但它可能会根据硬件/驱动程序工作)。我认为,在D3D10中,运行时总是取消绑定用作目标的目标

    为什么这是未定义的?GPU速度如此之快的原因之一是它们可以做出很多假设。例如,他们可以假设获取像素的单元不需要与写入像素的单元通信。因此可以读取曲面,N个周期后读取完成,N个周期后像素着色器结束执行,然后将其放入GPU上的一些输出合并缓冲区,最后在某个点写入内存。最重要的是,GPU以“未定义”的顺序进行光栅化(一个GPU可能以行的形式进行光栅化,另一个GPU可能以某种缓存友好的顺序进行光栅化,另一个GPU完全以另一种顺序进行光栅化),因此您不知道将首先写入曲面的哪些部分


    因此,您应该创建几个缓冲区。在模糊/光晕的情况下,两个通常就足够了-先渲染到第二个,然后在写入第二个时读取并模糊。如果需要,可以用乒乓球的方式重复这个过程。

    在某些特殊情况下,即使是背部缓冲也足够了。你只是没有做一个glClear,你以前画的仍然存在。当然,需要注意的是,你不能真正地从后台阅读。但是对于像淡入淡出这样的效果,这是可行的。

    谢谢,我在自己的研究中倾向于这样,尽管我无法得到具体的答案。@brandorf:我添加了一个指向帧缓冲区对象规范的链接,其中说结果未定义。