0

我有一个简单的工作顶点着色器。在全:

#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_normalmain()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);
}
4

1 回答 1

0

所以我设法让管道再次工作,方法是将语句glLinkProgram()移到调用.glBindAttribLocation()

由于默认情况下属性 0 工作,这没有引起注意(我假设......)

于 2013-07-05T11:07:25.537 回答