我的 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 代码?
环顾上述行 - 下一行有错误:
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 部分(因为可以传递一个字符串数组,而不仅仅是一个字符串)。
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |