奇怪而恼人的GLSL错误

时间:2013-11-26 21:55:15

标签: opengl attributes glsl variable-assignment varying

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

#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 );
}

基本上我收到错误消息“Shader -842150451中的错误 - 0< 9>:错误C7565:分配给变化的'texCoord'”

但我有另一个着色器完成同样的事情,当我编译它并且它有效时我没有得到任何错误!

任何想法可能会发生什么?

1 个答案:

答案 0 :(得分:3)

对于初学者来说,没有明智的理由从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;
}

Fragment Shader:

#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;。我评论了使用自定义变化的线条来向您展示我的意思。

<小时/>

The OpenGL® Shading Language (1.2) - 7.6变量变量 - 第53页

  

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

     

[...]

     

改变vec4 gl_TexCoord []; //最多将是gl_MaxTextureCoords

The OpenGL® Shading Language (1.2) - 7.3顶点着色器内置属性 - 第49页

  

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

     

[...]

     

属性vec4 gl_MultiTexCoord0;

底线是gl_MultiTexCoord<N>定义顶点属性(顶点着色器输入),gl_TexCoord [n]定义变化(顶点着色器输出,片段着色器输入)。值得一提的是,这些在GLSL的新版本(核心)版本中不可用。