奇怪和恼人的GLSL错误



我的顶点着色器如下所示:

#version 120
uniform float m_thresh;
varying vec2 texCoord;
void main(void)
{   
    gl_Position = ftransform();
    texCoord = gl_TexCoord[0].xy;
}

和我的碎片着色器:

#version 120
uniform float m_thresh;
uniform sampler2D grabTexture;
varying vec2 texCoord;
void main(void)
{
    vec4    grab = vec4(texture2D(grabTexture, texCoord.xy));
    vec3    colour = vec3(grab.xyz * m_thresh);
    gl_FragColor = vec4( colour, 0.5 );
}

基本上,我得到了错误消息"着色器错误-842150451-0<9>:错误C7565:分配到不同的'texCoord'"

但我有另一个着色器,它做完全相同的事情,当我编译它时,我不会出错,而且它很有效!!!

有什么想法吗?

对于初学者来说,没有合理的理由从texture2D (...)构建vec4。GLSL中的纹理函数总是返回vec4。同样,grab.xyz * m_thresh始终是vec3,因为标量乘以矢量不会改变矢量的维数。

现在,这里是事情变得有趣的地方。。。您正在使用的内置gl_TexCoord [n] GLSL实际上是一个预先声明的变化。您不应该在顶点着色器中读取此内容,因为它定义了顶点着色器输出/片段着色器输入。

GLSL 1.2中用于获取纹理单元N的纹理坐标的适当顶点着色器内置变量实际上是gl_MultiTexCoord<N>


因此,顶点和片段着色器应该如下所示:

顶点着色器:

#version 120
//varying vec2 texCoord; // You actually do not need this
void main(void)
{   
  gl_Position = ftransform();
  //texCoord  = gl_MultiTexCoord0.st; // Same as comment above
  gl_TexCoord [0] = gl_MultiTexCoord0;
}

片段着色器:

#version 120
uniform float m_thresh;
uniform sampler2D grabTexture;
//varying vec2 texCoord;
void main(void)
{
  //vec4  grab   = texture2D (grabTexture, texCoord.st);
  vec4  grab   = texture2D (grabTexture, gl_TexCoord [0].st);
  vec3  colour = grab.xyz * m_thresh;
  gl_FragColor = vec4( colour, 0.5 );
}

还记得我说过gl_TexCoord [n]是一个内置变量吗?您可以对此进行读/写,而不用在GLSL 1.2中创建自己的自定义varying vec2 texCoord;。我评论了使用自定义变体的行,以向您展示我的意思。


OpenGL®着色语言(1.2)-7.6可变变量-第53页

以下内置可变变量可用于写入顶点着色器中的。如果相应的片段着色器或固定管道中的任何功能使用它或从它派生的状态,则应写入特定的片段着色器。

[…]

可变矢量4 gl_TexCoord[]//最多为gl_MaxTextureCoords

OpenGL®着色语言(1.2)-7.3顶点着色器内置属性-第49页

以下属性名称内置在OpenGL顶点语言中,可以在顶点着色器中使用,以访问OpenGL声明的属性的当前值。

[…]

属性vec4 gl_MultiTexCoord0

底线是gl_MultiTexCoord<N>定义顶点属性(顶点着色器输入),gl_TexCoord [n]定义变化(顶点着色器输出、片段着色器输入)。同样值得一提的是,GLSL的更新(核心)版本中没有这些功能。

最新更新