GLSL - 将坐标传递给片段着色器?

rsp*_*cer 6 opengl shader glsl

我有以下着色器

VertexShader

#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;
}
Run Code Online (Sandbox Code Playgroud)

FragmentShader

#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);
}
Run Code Online (Sandbox Code Playgroud)

我期望这样做是绘制场景,左上角是绿色,右上角是黄色,右下角是红色,左下角是黑色.事实上,这是当我更换会发生什么ShadowCoord.xgl_FragCoord.x我的片段着色器.那么,为什么我只得到一个垂直的绿色渐变?显然,我的ShadowCoord正在发生一些棘手的事情.有人知道这是什么吗?

Nic*_*las 10

是的,gl_FragCoord是"衍生自gl_Position".但这并不意味着它是等于它.

gl_Position是特定顶点的剪辑空间位置.gl_FragCoord.xyz包含片段的窗口空间位置.这些空间不一样.为了从一个到另一个,图形硬件执行许多转换.

转换是发生其他值.这就是碎片着色器不会调用它的原因gl_Position; 因为它不再是那个价值了.它是基于用户设置的各种状态(视口和深度范围)从原始计算的新值.

用户定义的顶点参数按原样进行插值.用户定义的插值参数不会发生任何"棘手"现象.系统正在做它应该做的事情:插入穿过三角形表面的值.