gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:48:51 24 4
gpt4 key购买 nike

我的 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

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

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

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

最佳答案

查看提到的行 - 下一行有错误:

  gl_FragColor = vec4(u_Ka * ambientColor +
u_Kd * lambertian * u_diffuseColor +
u_Ks * specular * u_specularColor, 1.0);

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

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

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

关于opengl - 当错误消息行号错误时如何调试着色器编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62399187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com