シンプルで機能する頂点シェーダーがあります。略さずに:
#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 を使用することを選択しました。そこで、次のように 2 番目の属性を追加しました。
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);
これらの 3 つの段階のそれぞれは、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);
}