11

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;
}
4

1 に答える 1

7

4096 を掛けるのではなく 4 で割る必要があるという点では、そのとおりです。ウィキのエントリ、言葉遣いが悪いです。

于 2011-12-21T14:48:44.867 に答える