glsl片段着色器中的特定坐标输出



有没有办法通过坐标设置特定像素的颜色,而不是使用gl_FragColor输出的预定坐标?

我目前正在尝试通过着色器实现Mean Shift算法。我的输入是黑白纹理,其中白点表示要聚类的点,黑色表示没有数据。

在计算了邻域中所有点位置的加权平均值后,我必须将结果位置中的像素设置为代表聚类的新颜色。

例如,如果我查看以像素为中心的18x18的邻域,则与fragcord相关,并找到3个白色像素:Fragcord=30,33像素1:坐标(30,33)像素2:坐标(27,33)像素3:坐标(30,30)

计算出他们的平均位置后,我得到(29,32)。在具有不同fragcord(例如,30,33)的着色器单元中,是否有方法将29,32处的像素设置为不同的颜色?

类似gl_FragColor(vec2(29,32))=vec4(1.0,1.0,1.0,1.0)?

正如克里斯蒂安所说,这是不可能的;如果你能使用它,计算框架或图像加载/存储是你最好的选择。

如果必须在不加载/存储图像的情况下使用GLSL,则可以选择:如果图像总共有n个像素,则将n个顶点作为点发送到顶点着色器;在顶点着色器中,根据gl_VertexID(在GLSL 1.10中可用……如果您有1.40+,则可能应该使用实例化和gl_InstanceID)读取纹理,并定位点,以便当它进入片段着色器时,它正好覆盖您想要的像素。然后让像素着色器输出白色,不管怎样。

这是一个破解,但如果你没有其他选择,它可能会很好。

不,这是不可能的。片段着色器是为特定位置的特定片段调用的,并且只能输出该特定片段的值(或描述整个片段),然后将这些值恰好写入该预定片段位置的帧缓冲区。

您所能做的根本不是将输出写入帧缓冲区,而是写入其他一些存储区,无论是任意图像(使用图像加载/存储)还是着色器存储缓冲区。但这两个功能需要相当现代化的硬件功能(GL 4+硬件)。在这种情况下,您也可以首先使用适当的计算着色器(或者实际的计算框架,如CUDAOpenCL,如果您不需要任何其他OpenGL功能)来完成整个任务。


另一种同样适用于旧硬件的方法是在顶点着色器而不是片段着色器中进行操作。通过这种方式,您可以相应地计算顶点的片段空间位置(然后转换为片段位置)。当使用几何体着色器而不是顶点着色器时,您甚至可以散射数据(为单个输入计算多个输出)或丢弃内容。

最新更新