2

私の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 実装のバグではないかと思います...

4

1 に答える 1

1

glLinkProgram の前に glBindAttribLocation を呼び出していますか? 頂点属性は glLinkProgram 中にのみインデックスが割り当てられるため、後で呼び出しても効果はありません。

GLSL 3.30+ では、GLSL コードで属性インデックスを直接指定するより良い方法があります。

layout(location=0) in vec4 in_position;
layout(location=1) in vec4 in_colour;
layout(location=2) in vec3 in_normal;  

編集:ああ、レイアウトキーワードを試した部分はスキップしました。

于 2012-05-11T04:09:59.737 に答える