错误消息行号错误时如何调试着色器编译器错误?

Tom*_*sso 2 opengl glsl

我的 OpenGL 应用程序从两个 ascii 源文件加载其顶点和片段着色器。编译片段着色器会产生以下错误:

0:35(22): error: operands to arithmetic operators must be numeric
0:35(17): error: cannot construct `vec4' from a non-numeric data type
0:40(31): error: too many parameters to `vec4' constructor
Run Code Online (Sandbox Code Playgroud)

到目前为止,在几个小时后,我无法找到这些错误的原因。这是着色器源:

#version 330
/*
Adapted from phong shader demo at http://www.cs.toronto.edu/~jacobson/phong-demo/
*/
/// precision MEDIUMP float;  // Generates a syntax error on non-embedded OpenGL
varying vec3 normalInterp;  // Surface normal
varying vec3 vertPos;       // Vertex position
uniform int mode;   // Rendering mode
uniform float u_Ka;   // Ambient reflection coefficient
uniform float u_Kd;   // Diffuse reflection coefficient
uniform float u_Ks;   // Specular reflection coefficient
uniform float u_shininess; // Shininess

// Material color
/// uniform vec3 u_ambientColor;
uniform vec3 u_diffuseColor;
uniform vec3 u_specularColor;
uniform vec3 u_lightPos; // Light position

varying vec4 ambientColor;

void main() {
  vec3 N = normalize(normalInterp);
  vec3 L = normalize(u_lightPos - vertPos);

  // Lambert's cosine law
  float lambertian = max(dot(N, L), 0.0);
  float specular = 0.0;
  if(lambertian > 0.0) {
    vec3 R = reflect(-L, N);      // Reflected light vector
    vec3 V = normalize(-vertPos); // Vector to viewer
    // Compute the specular term
    float specAngle = max(dot(R, V), 0.0);
    specular = pow(specAngle, u_shininess);
  }  // This is line 35!
  gl_FragColor = vec4(u_Ka * ambientColor +
                      u_Kd * lambertian * u_diffuseColor +
                      u_Ks * specular * u_specularColor, 1.0);
Run Code Online (Sandbox Code Playgroud)

但是着色器源文件的“第 35 行”是一个结束的 '}',而不是一个实际的语句。如何解释编译器错误消息上的行号?有人可以帮我找出这些错误吗?当错误消息行号错误时,人们如何调试 GLSL 代码?

gkv*_*311 5

环顾上述行 - 下一行有错误:

  gl_FragColor = vec4(u_Ka * ambientColor +
                      u_Kd * lambertian * u_diffuseColor +
                      u_Ks * specular * u_specularColor, 1.0);
Run Code Online (Sandbox Code Playgroud)

ambientColor定义为vec4在数学中使用,期望vec3作为vec4(rgb, a)构造函数的第一个参数。

所以特定的行可能看起来像这样:

gl_FragColor = vec4(ambientColor.rgb * u_Ka
                  + u_diffuseColor * lambertian * u_Kd
                  + u_specularColor * specular * u_Ks, 1.0);
Run Code Online (Sandbox Code Playgroud)

GLSL 日志因供应商而异,但通常日志中的行号看起来是正确的,只要您自己的 GLSL 代码的编号没有混淆。

0:35(22)通常是指传递到代码中glShaderSource()第 35 行和第 22 列的 GLSL 代码的第 0 部分(因为可以传递一个字符串数组,而不仅仅是一个字符串)。