AMD Radeon HD 6970M 2048 MB グラフィックス カードを搭載した iMac 用の GLSL 頂点シェーダーを作成しています。
GL_MAX_VERTEX_ATTRIBS: 16
GL_MAX_VERTEX_UNIFORM_COMPONENTS: 4096
GL_VERSION: 2.1 ATI-7.12.9
GL_SHADING_LANGUAGE_VERSION: 1.20
私のシェーダーでは、均一な mat4 の大きな配列が必要です。
uniform mat4 T[65]
しかし、これらを 65 個使用しようとすると、シェーダーが (ひそかに) Apple Software Renderer モードに切り替わります。代わりに 64 を使用する場合:
uniform mat4 T[64]
すべて順調。
ユニフォームの最大数を超えると問題が発生するようです。しかし、上で書いたように、GL_MAX_VERTEX_UNIFORM_COMPONENTS に対して 4096 を取得しているので、4096/(4*4) = 64 ではなく 256...
OpenGL.org wikiによると
ATI/AMD 注: ATI の最大コンポーネント値は間違っています。これらは、コンポーネントの実際の数を 4 で割ったものです。
しかし、これを読むと、GL_MAX_VERTEX_UNIFORM_COMPONENTS をクエリして 4096 を取得すると、実際には 16,384 になると思います。GL_MAX_VERTEX_UNIFORM_COMPONENTS は実際のコンポーネント数を4倍して返すようです。これにより、1024/(4*4) = 64 が得られます。
誰でもこれを確認できますか?
編集: 私のシェーダーは単純です:
#version 120
// 65 goes into software render mode
#define MAX_T 64
attribute vec4 indices;
uniform mat4 T[MAX_T];
void main()
{
gl_Position = T[int(indices[0])]*gl_Vertex;
}