GLSL - 把坐标传递给片元着色器?

10

我有以下着色器

顶点着色器

#version 330
layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec4 inColour;
layout (location = 2) in vec2 inTex;
layout (location = 3) in vec3 inNorm;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
out vec4 ShadowCoord;
void main()
{
  gl_Position = projectionMatrix * transformationMatrix * vec4(inPosition, 1.0);
  ShadowCoord = gl_Position;
}

片元着色器

#version 330
in vec4 ShadowCoord;
out vec4 FragColor;
uniform sampler2D heightmapTexture;
void main()
{
  FragColor =  vec4(vec3(clamp(ShadowCoord.x/500,0.0,1.0),clamp(gl_FragCoord.y/500,0.0,1.0),0.0),1.0);
}
我期望它会绘制场景,左上角为绿色,右上角为黄色,右下角为红色,左下角为黑色。当我在我的片段着色器中将ShadowCoord.x替换为gl_FragCoord.x时,实际上就是发生了这种情况。那么,为什么我只得到了一个垂直渐变的绿色呢?很明显,我的ShadowCoord出了点问题。有人知道是怎么回事吗?

1
“有人知道这是什么吗?” 不知道。因为ShadowCoord的内容完全取决于两个矩阵的内容,而我们不知道它们是什么。我们甚至不知道您是否使用透视或正交投影。 - Nicol Bolas
好的,但问题在于如果我在片段着色器中用gl_FragCoord替换ShadowCoord,那么它就可以工作了。 gl_FragCoord不是由gl_Position派生出来的吗? 如果是这样,为什么ShadowCoord没有经过相同的插值?<EDIT> FYI,这是相机变换的透视投影。 - rspencer
1个回答

16

是的,gl_FragCoord“来源于gl_Position”。但这并不意味着它们是相等的。

gl_Position 是特定顶点的裁剪空间位置。 gl_FragCoord.xyz 包含片段的窗口空间位置。这些不是同一个空间。为了从一个空间到另一个空间,图形硬件执行一系列变换

这些变换对其他值没有发生。这就是片段着色器没有称之为gl_Position的原因;因为它不再是那个值了。它是根据用户设置的各种状态(视口和深度范围)从原始值计算出来的新值。

用户定义的顶点参数按其本身的值进行插值。您自定义的插值参数没有发生任何奇怪的事情。系统正在做它该做的事情:在三角形表面上插值传递给它的值。


好的,这很有道理。那么如何告诉系统在不同的变量上执行这些过程呢?比如说,最终ShadowCoord是由其他转换矩阵给出的,我想要获取其“片段”的坐标。我是否需要手动实现链接中描述的内容? - rspencer
1
“那么如何告诉系统在不同的变量上执行这些过程呢?”你不能;你必须自己计算。这只是另一个矩阵乘法;你可以将其折叠到你已经使用的矩阵的后端中。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接