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 を使用することを選択しました。そこで、次のように 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_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