私のglsl 130コードがやや新しい(ATI 5850)ハードウェアで正しく実行されないという問題がありますが、同じコードは私が持っているNVIDIAカードを搭載した古いラップトップで完全に正常に実行されます..これはopenglに関係なくケースです.私が使用するコンテキスト。発生するのはベクトルです。in_position、in_colour、および in_normal は、新しいハードウェアで適切にバインドされません。新しいハードウェアで新しいバージョンの glsl (330) を強制されているようです。
頂点シェーダーの glsl コードは次のとおりです。かなりシンプルで基本的なものです。
#version 130
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 normalMatrix;
in vec4 in_position;
in vec4 in_colour;
in vec3 in_normal;
out vec4 pass_colour;
smooth out vec3 vNormal;
void main()
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_position;
vec4 vRes = normalMatrix*vec4(in_normal, 0.0);
vNormal = vRes.xyz;
pass_colour = in_colour;
}
何が起こるかは、次のデータです。
in vec4 in_position;
in vec4 in_colour;
in vec3 in_normal;
結合しないか、完全ではありません。値が奇妙に歪んでいます。私のテストでは、他のすべてが適切に機能します。バージョンを 330 に変更し、location キーワードを使用すると問題は修正されますが、コードは古いバージョンの OpenGL と互換性がなくなります...
これらの場所を指定するために使用するコードのサンプルを次に示します。
プログラムの場合:
glBindAttribLocation(LD_standard_program, 0, "in_position");
glBindAttribLocation(LD_standard_program, 1, "in_colour");
glBindAttribLocation(LD_standard_program, 2, "in_normal");
その後、データ自体について:
--- code to buffer vertex data
glEnableVertexAttribArray(0);
glVertexAttribPointer((GLuint) 0, 4, GL_FLOAT, GL_FALSE, 0, 0);
--- code to buffer colour data
glEnableVertexAttribArray(1);
glVertexAttribPointer((GLuint) 1, 4, GL_FLOAT, GL_FALSE, 0, 0);
--- code to buffer normal data
glEnableVertexAttribArray(2);
glVertexAttribPointer((GLuint) 2, 3, GL_FLOAT, GL_FALSE, 0, 0);
私の質問は: opengl は下位互換性があるはずではありませんか?? プログラムを異なるハードウェアで実行するために、opengl の単一バージョンごとに個別のシェーダーを作成する必要があるのではないかと心配し始めています...これらの属性のバインドは非常に基本的な機能であるため、ATI 実装のバグではないかと思います...