在 Fragmentshader OpenGL 中访问不同的 Fragment
Access different Fragment in Fragmentshader OpenGL
我可以在 Fragmentshader 的特定位置访问和更改另一个 Fragment 的输出值吗?
例如,在 main() 循环中,我像往常一样处理所有内容并输出具有某些值的颜色。但除此之外,我还希望位置 vec3(5,3,6) (在世界坐标中)的片段具有相同的颜色。
现在我已经在网上对此进行了一些研究。 OpenGL 站点说,片段着色器有一个片段作为输入,一个片段作为输出,这听起来不太有希望。
我也知道所有片段都在并行处理。但是也许可以说,如果这个位置的片段还没有被处理过,就把这个颜色写入它,并认为这个片段已经被处理过。
有人可以解释这是否可行,如果不可行,为什么这不是一个好主意。我最好的猜测是,将此逻辑构建到着色器中,会对整体性能产生非常糟糕的影响。
My be someone can explain if this is posible somehow and if not, why this is not a good idea.
这不是坏主意与好主意的问题。根本不可能。
最接近此功能的是 ARB_fragment_shader_interlock。通过其互锁和顺序保证,它允许 有限 互操作。这个限制是......它只允许覆盖相同 pixel/sample.
的片段进行互操作
所以即使这个功能也不允许您写入其他像素。
你能做的绝对最好是使用SSBO和原子计数器让片段着色器写入他们想要写入的颜色值和"world coordinates",然后第二个进程将该缓冲区作为渲染命令或计算着色器执行以实际写入该数据。
正如 Nicol 的回答中已经指出的那样,您不能在片段着色器中写入帧缓冲区表面的其他片段。
您的用例描述不够清晰,无法说明哪种方法最有效。为了集思广益,想到的最直接的方法是根本不使用帧缓冲区绘制表面,而是输出到图像。
如果将纹理绑定为图像,则可以使用 imageStore()
内置函数在片段着色器中对其进行写入。此函数将坐标作为参数之一,因此您可以写入所需的任何像素,以及从同一着色器调用写入多个像素。
根据您想要实现的目标,我还可以想象一种混合方法,您的主要渲染仍然进入帧缓冲区,但您将额外的像素值写入所需位置的图像。然后,在第二个渲染通道中,您可以将图像内容与主渲染结合起来。如果 math/logic 足够简单,则可以通过混合来完成组合。如果需要更复杂的组合,可以使用一个纹理作为初始pass的framebuffer附件,然后将渲染的结果和额外的图像作为组合pass的片段着色器的两个输入。
我可以在 Fragmentshader 的特定位置访问和更改另一个 Fragment 的输出值吗?
例如,在 main() 循环中,我像往常一样处理所有内容并输出具有某些值的颜色。但除此之外,我还希望位置 vec3(5,3,6) (在世界坐标中)的片段具有相同的颜色。
现在我已经在网上对此进行了一些研究。 OpenGL 站点说,片段着色器有一个片段作为输入,一个片段作为输出,这听起来不太有希望。 我也知道所有片段都在并行处理。但是也许可以说,如果这个位置的片段还没有被处理过,就把这个颜色写入它,并认为这个片段已经被处理过。
有人可以解释这是否可行,如果不可行,为什么这不是一个好主意。我最好的猜测是,将此逻辑构建到着色器中,会对整体性能产生非常糟糕的影响。
My be someone can explain if this is posible somehow and if not, why this is not a good idea.
这不是坏主意与好主意的问题。根本不可能。
最接近此功能的是 ARB_fragment_shader_interlock。通过其互锁和顺序保证,它允许 有限 互操作。这个限制是......它只允许覆盖相同 pixel/sample.
的片段进行互操作所以即使这个功能也不允许您写入其他像素。
你能做的绝对最好是使用SSBO和原子计数器让片段着色器写入他们想要写入的颜色值和"world coordinates",然后第二个进程将该缓冲区作为渲染命令或计算着色器执行以实际写入该数据。
正如 Nicol 的回答中已经指出的那样,您不能在片段着色器中写入帧缓冲区表面的其他片段。
您的用例描述不够清晰,无法说明哪种方法最有效。为了集思广益,想到的最直接的方法是根本不使用帧缓冲区绘制表面,而是输出到图像。
如果将纹理绑定为图像,则可以使用 imageStore()
内置函数在片段着色器中对其进行写入。此函数将坐标作为参数之一,因此您可以写入所需的任何像素,以及从同一着色器调用写入多个像素。
根据您想要实现的目标,我还可以想象一种混合方法,您的主要渲染仍然进入帧缓冲区,但您将额外的像素值写入所需位置的图像。然后,在第二个渲染通道中,您可以将图像内容与主渲染结合起来。如果 math/logic 足够简单,则可以通过混合来完成组合。如果需要更复杂的组合,可以使用一个纹理作为初始pass的framebuffer附件,然后将渲染的结果和额外的图像作为组合pass的片段着色器的两个输入。