有没有办法在片段着色器中使用先前渲染的结果?

Posted

技术标签:

【中文标题】有没有办法在片段着色器中使用先前渲染的结果?【英文标题】:Is there any way to use results of a previous rendering inside a fragment shader? 【发布时间】:2014-01-26 11:36:06 【问题描述】:

我正在使用片段着色器来渲染纹理。我希望下一个着色器使用上一次迭代的渲染。这怎么可能?

【问题讨论】:

这里的示例games.greggman.com/game/webgl-image-processing-continued 【参考方案1】:

在片段着色器中重用纹理:

要么

取消绑定纹理所附加的当前帧缓冲对象(绑定null帧缓冲对象或绑定另一个帧缓冲对象),

从帧缓冲区对象中分离纹理(并附加 null,使用 framebufferTexture2D 附加另一个纹理或附加渲染缓冲区)。

然后将纹理绑定为要在片段着色器中使用的普通纹理(通过着色器代码中的sampler2Dtexture2D)。

要在顶点着色器中重用纹理,大致相同,只是这个特性(顶点纹理)是非标准的(并且有一些限制)。检查MAX_VERTEX_TEXTURE_IMAGE_UNITS 以获得支持。

如果您有一个需要多次渲染通道的迭代算法,一种典型的方法是在两个纹理 1 和 2 之间切换:在奇数渲染通道期间,将 1 附加到当前帧缓冲区对象,将 2 绑定为普通纹理,然后在甚至渲染过程中,情况正好相反。另请参阅this answer,了解是否应在单个帧缓冲区对象中更改纹理附件还是应交换整个帧缓冲区对象。

【讨论】:

如何将它从帧缓冲区中分离出来?您能否为第一段提供一些代码示例? 帧缓冲区应该被交换。更改附件应该是一项更昂贵的操作。要使帧缓冲区完整,一大堆事情必须是真实的。每次您附加/分离所有这些东西时都需要检查。相反,如果帧缓冲区已经完成,则不需要检查任何内容,因此交换帧缓冲区可以是即时的,而交换附件可能很慢。另一方面,任何一种方法成为瓶颈的可能性都非常低。 您可以通过将“null”附加到该附件点来分离附件。 gl.framebufferTexture2D(gl.FRAMEBUFFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);texture 附加到 COLOR_ATTACHMENT0。将texture 更改为null 以将null 绑定到COLOR_ATTACHMENT0,这实际上是分离texture

以上是关于有没有办法在片段着色器中使用先前渲染的结果?的主要内容,如果未能解决你的问题,请参考以下文章

从片段着色器中的地形高程数据计算法线

你能改变金属着色器中采样器的边界吗?

在片段着色器中使用 textureCube 访问环境贴图失败

在GLSL ES中的片段着色器上旋转纹理

在片段着色器中绘制别名像素完美线?

在片段着色器中,为啥我不能使用平面输入整数来索引 sampler2D 的统一数组?