我有一个简单的工作顶点着色器。在全:
#version 150
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
in vec4 in_pos;
out vec4 color;
main(void) {
gl_Position = projection * view * model * in_pos;
color = vec4(0.6, 0.1, 0.1, 1.0);
}
这可以按预期完美运行。
我正在尝试添加法线并选择使用多个 VBO 而不是交错。所以我添加了第二个属性如下;
glBindAttribLocation(shaderProgramID, 1, "in_normal");
启用它;
glEnableVertexAttribArray(1);
并向其写入数据:
int nVBO = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferData(GL_ARRAY_BUFFER, nBuffer, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, false, 0, 0);
这三个阶段中的每一个都精确地反映了我的in_pos
属性代码,这似乎工作得很好,所以我假设以上所有内容都可以吗?
在这个阶段,如果我编译并运行,它的工作方式和以前完全一样。当我尝试编辑着色器文件时出现问题。
我添加了新in
属性;in vec4 in_normal;
,它仍然可以编译和运行,而不会更改渲染。
只要我在正文中添加任何引用(例如),程序就会有一个完全黑色的渲染。着色器报告它编译得很好,并且在整个程序中都是空的。in_normal
main()
vec4 n = in_normal;
glGetError()
为什么如此简单的更改会破坏管道?特别是当它对color
变量没有影响时,并且仍然编译没有错误。
最后为了完整起见,着色器的损坏版本:
#version 150
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
in vec4 in_pos;
in vec4 in_normal;
out vec4 color;
main(void) {
gl_Position = projection * view * model * in_pos;
vec4 n = in_normal;
color = vec4(0.6, 0.1, 0.1, 1.0);
}