OpenGL仕様は嘘です(またはこれはバグですか?)... std140のレイアウトを参照して、共有ユニフォームバッファを使用すると、次のように述べられています。
「表 e L-1 に示されている一連のルールは、GLSL コンパイラによって std140 修飾された均一なブロックにメンバーをレイアウトするために使用されます。ブロック内のメンバーのオフセットは、ブロック内の前のメンバーのサイズに基づいて累積されます (問題の変数の前に宣言されたもの)、および開始オフセット最初のメンバーの開始オフセットは常にゼロです。
スカラー変数の型 (bool、int、uint、float) - 基本的なマシン タイプのスカラーのサイズ"
( http://www.opengl-redbook.com/appendices/AppL.pdf )
したがって、この情報を利用して、シェーダーに次のような均一なブロックをセットアップします。
// Spotlight.
layout (std140) uniform Spotlight
{
float Light_Intensity;
vec4 Light_Ambient;
vec3 Light_Position;
};
... CPU側でセットアップした後続のstd140レイアウトでは機能しないことを発見するだけです。つまり、最初の 4 バイトは float (GLfloat のマシン スカラー型のサイズ) であり、次の 16 バイトは vec4 であり、次の 12 バイトは vec3 です (ルールを考慮して最後に 4 バイトが残ります)。 vec3 が実際には vec4 であること)。
CPU 側を変更して float を vec4 と同じサイズ (つまり 16 バイト) に指定し、オフセットとバッファー サイズをこの仮定で行うと、シェーダーは意図したとおりに動作します。
したがって、仕様が間違っているか、このコンテキストでの「スカラー」の意味を誤解しているか、ATI にドライバーのバグがあるかのいずれかです。誰かこの謎に光を当てることができますか?