如何在glsl中计算gl_FragCoord

时间:2009-08-17 14:14:47

标签: opengl glsl fragment-shader

好的,在我的GLSL片段着色器中,我希望能够计算片段与空间中特定行的距离。

这样做的结果是我首先尝试在我的顶点着色器中使用不同的vec2集来反映最终在gl_FragCoord中的内容:

varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;

现在在片段着色器中我期待:

gl_FragCoord.xy==fake_frag_coord

但事实并非如此。管道在gl_Position上执行了哪些操作,将其转换为我gl_FragCoord忽略的fake_frag_coord

4 个答案:

答案 0 :(得分:11)

gl_FragCoord是屏幕坐标,因此您需要获得有关屏幕大小的信息,以便根据位置生成屏幕大小。你生成的fake_frag_coord将对应于我认为的标准化设备坐标(-1到1)中屏幕上的一个点。因此,如果您要在特定维度上乘以屏幕大小的一半,然后添加该大小,您将获得实际的屏幕像素。

答案 1 :(得分:0)

你遇到的问题是在着色器中计算的gl_ModelViewProjectionMatrix * gl_Vertex并不总是固定函数管道产生的。要获得相同的结果,请执行fake_frag_coord = ftransform()。

编辑:

然后根据屏幕尺寸进行缩放。

答案 2 :(得分:0)

我希望我有更多的代表,所以我也可以挑剔。 这就是我所知道的。 OpenGL会自动为你执行Divide-By-W,所以当一个位置到达片段着色器时,它已经处于NDC坐标中,然后W将为1.0,你需要除以W的唯一时间就是你想要在CPU端进行相同的数学计算,并获得相同的结果,或者,如果由于某些奇怪的原因,想要在顶点着色器中获得NDC坐标。

答案 3 :(得分:-2)

varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy