私の頂点シェーダーをATIドライバーのOpenGL3.3コアで実行するのに非常に問題がありました。
#version 150
uniform mat4 graph_matrix, view_matrix, proj_matrix;
uniform bool align_origin;
attribute vec2 graph_position;
attribute vec2 screen_position;
attribute vec2 texcoord0;
attribute vec4 color;
varying vec2 texcoord0_px;
varying vec4 color_px;
void main() {
// Pick the position or the annotation position
vec2 pos = graph_position;
// Transform the coordinates
pos = vec2(graph_matrix * vec4(pos, 0.0, 1.0));
if( align_origin )
pos = floor(pos + vec2(0.5, 0.5)) + vec2(0.5, 0.5);
gl_Position = proj_matrix * view_matrix * vec4(pos + screen_position, 0.0, 1.0);
texcoord0_px = texcoord0;
color_px = color;
}
glVertexAttrib4fを使用して色属性を指定し、属性配列をオフにしました。3.3コア仕様の33ページによると、これは機能するはずです。
頂点シェーダーに必要なジェネリック属性に対応する配列が有効になっていない場合、対応する要素は現在のジェネリック属性の状態から取得されます(セクション2.7を参照)。
しかし(ほとんどの場合、プロファイルとドライバーによっては)シェーダーがまったく実行されなかったか、無効な色属性にアクセスした場合は黒を使用していました。定数に置き換えると実行されます。
多くの検索により、WebGLに関するヒントのこのページが得られました。
常に頂点属性0配列を有効にします。頂点属性0配列を無効にして描画する場合、デスクトップOpenGL(Mac OSXなど)で実行しているときに、ブラウザーに複雑なエミュレーションを強制します。これは、デスクトップOpenGLでは、頂点属性0が配列対応でない場合、何も描画されないためです。bindAttribLocation()を使用して頂点属性にロケーション0を使用させ、enableVertexAttribArray()を使用して配列を有効にすることができます。
案の定、色属性がインデックスゼロに割り当てられただけでなく、別の配列対応属性を強制的にゼロにバインドすると、コードが実行され、正しい色が生成されました。
このルールに関する他の言及はどこにも見つかりません。確かにATIハードウェアでは見つかりません。このルールがどこから来ているのか誰か知っていますか?それとも、これはMozillaの人々が気づき、警告した実装のバグですか?