1

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

#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'”

但是我有另一个着色器,它做同样的事情,当我编译它时我没有收到任何错误,它可以工作!!!

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

4

1 回答 1

4

对于初学者来说,没有合理的理由texture2D (...). 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]的是内置变量吗?你可以读/写这个而不是varying vec2 texCoord;在 GLSL 1.2 中创建你自己的自定义。我注释掉了使用自定义变量的行,以向您展示我的意思。


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

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

[...]

变化的 vec4 gl_TexCoord[]; // 最多是 gl_MaxTextureCoords

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

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

[...]

属性 vec4 gl_MultiTexCoord0;

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

于 2013-11-26T22:15:28.933 回答