実行中のシェーダプログラムに頂点属性を渡すときに問題があります。私は2つの属性、位置と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
precision highp float;
// input
in vec4 PassColor;
// output
out vec4 FragColor;
void main(void) {
FragColor = PassColor;
}
なぜ結合「InPosition」仕事と「InColor」:
は#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);
}
マイフラグメントシェーダは、単にその色を返す必要があります:私は本当にすべてが頂点を変換し、フラグメントシェーダに色を渡すことですではない?私は、GLSLコンパイラがシェーダコードを最適化するので、未使用の変数をバインドできないことに気付いています。しかし、私はここで色を最適化すべき理由を理解していません。結局のところ、私はそれをフラグメントシェーダに渡すことによってそれを使用します。
「glGetError()」はありますか?また、あなたのGPUとドライバのバージョンは何ですか? – Kos