將頂點屬性傳遞給正在運行的着色器程序時出現問題。我想通過兩個屬性,位置和一個RGBA顏色。綁定屬性位置適用於該位置。但是,它不適用於顏色。因此,所有的幾何圖形最終都會呈現黑色。GLSL 1.5和OpenGL 3.3:將顏色傳遞給頂點着色器似乎失敗
這是我做的:
GLuint programHandler;
// create program
// compile & attach vertex shader
// compile & attach fragment shader
glBindAttribLocation(programHandler, 0, "InPosition");
glBindAttribLocation(programHandler, 1, "InColor");
glBindFragDataLocation(programHandler, 1, "FragColor");
glLinkProgram(programHandler);
glUseProgram(programHandler);
// initialize uniform variables
// I'm trying to get the attribute locations now.
// I expect location "0" for InPosition and location "1" for InColor.
// In fact, it gets me a "-1" for InColor. I simply cannot see the reason for that behaviour
GLint positionLocation = glGetAttribLocation(programHandler, "InPosition"); // returns 0
GLint colorLocation = glGetAttribLocation(programHandler, "InColor"); // returns -1
glEnableVertexAttribArray(positionLocation);
glEnableVertexAttribArray(colorLocation); // fails!
我的頂點着色器是非常基本的。我真正要做的是轉變頂點並通過顏色的片段着色器:
#version 150 core
// input
uniform mat4 ModelviewMatrix;
uniform mat4 ProjectionMatrix;
in vec3 InPosition;
in vec4 InColor;
// output
out vec4 PassColor;
void main(void) {
// passing color through to fragment shader
PassColor = InColor;
// transformation
gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(InPosition, 1.0);
}
我的片段着色器應該簡單地返回顏色:
#version 150 core
precision highp float;
// input
in vec4 PassColor;
// output
out vec4 FragColor;
void main(void) {
FragColor = PassColor;
}
爲什麼綁定「器就位」工作和「InColor」纔不是?我知道GLSL編譯器會優化着色器代碼,以便不能綁定未使用的變量。但是,我不明白爲什麼這裏應該優化顏色。畢竟,我通過將它傳遞給片段着色器來使用它。
任何`glGetError()`在那裏?另外,你的GPU和驅動程序版本是什麼? – Kos 2010-12-07 12:00:38