【问题标题】:GLSL - Passing coordinates to fragment shader?GLSL - 将坐标传递给片段着色器?
【发布时间】:2013-09-03 10:35:44
【问题描述】:

我有以下着色器

顶点着色器

#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 发生了一些奇怪的事情。有人知道是什么吗?

【问题讨论】:

  • "有人知道它是什么吗?" 没有。因为ShadowCoord 的内容完全取决于我们拥有的两个矩阵的内容不知道它们是什么。我们甚至不知道您使用的是透视项目还是正交项目。
  • 好的,但关键是,如果我在片段着色器中用 gl_FragCoord 替换 ShadowCoord,那么它就可以工作。 gl_FragCoord 不是从 gl_Position 派生的吗?如果是这样,为什么 ShadowCoord 不进行相同的插值? 仅供参考,它是相机变换的透视投影。

标签: opengl glsl shader


【解决方案1】:

是的,gl_FragCoord 是“派生自 gl_Position”。那是否意味着它等于它。

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

不会发生在其他值上的转换。这就是为什么片段着色器不叫它gl_Position;因为它不再是那个价值了。它是根据用户设置的各种状态(视口和深度范围)从原始计算得出的新值。

用户定义的顶点参数按原样进行插值。您的用户定义的插值参数没有发生任何“棘手”的事情。系统正在做它应该做的事:对你在三角形表面上传递的值进行插值。

【讨论】:

  • 说得对。那么如何告诉系统在不同的变量上执行这些过程呢?说,最终,ShadowCoord 是由其他一些变换矩阵给出的,然后我想得到它的“片段”的坐标。我是否必须手动实现链接中描述的内容?
  • "那么如何告诉系统在不同的变量上执行这些过程?" 你不知道;你必须自己计算它。这只是另一个矩阵乘法;你可以把它折叠到你已经在使用的矩阵的后端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多