2011-12-21 5 views
10

私はAMDのRadeon HD 6970M 2048メガバイトのグラフィックスカードを搭載したiMacのためのGLSLの頂点シェーダ書いている:ATIグラフィックスカード上のGLSLシェーダの頂点均一コンポーネントの実際の数はいくらですか?

uniform mat4 T[65] 
:私は制服mat4sの大規模な配列を持っていると思います私のシェーダで

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 

しかし、私がこれらの65個のシェーダー(秘密裏に)をAppleソフトウェアレンダラーモードに切り替えることを試みた場合。代わりに64:

uniform mat4 T[64] 

すべてが問題ありません。

ユニフォームの最大数を超える問題があるようです。しかし、私は、私はGL_MAX_VERTEX_UNIFORM_COMPONENTSので、4096/4096を取得しています(4 * 4)= 256ではない64 ...

OpenGL.org wiki

ATI/AMDのノート語る上で書いたように:ATI最大成分値があります違う。彼らは私が私がGL_MAX_VERTEX_UNIFORM_COMPONENTSを照会し、4096を取得する場合、私は実際に16,384を持っていると思うだろう4.

しかし、これを読んで割った部品の実際の数です。何が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; 
} 
+3

シェーダコード、または少なくとも使用されているすべての制服の定義を投稿してください。そしてあなたは正しいisofarです。1024を4で除算する必要はありません。 wikiエントリはひどく言い訳されています。 – datenwolf

+0

私は上記のシェイダーコードを掲示しました(私はカウントダウンする前にそれに気づいたので、63-> 64と64-> 65という元の質問の数字を編集しました)。 –

+1

@datenwolfこれは彼の問題であるように思われるので、答えとして投稿してください。私は彼がちょうど最後の64番目の行列スロットをブロックする(組み込みの制服も数えます)、他の小さなユニフォームを使っていると思います。 –

答えて

7

あなたは掛けない4で4096を分割する必要があること、右isofarです。ウィキエントリです。

+5

ひどく言われていません。もう一度見てください。また、そのページの編集履歴も見ないでください。私はそれを書いた人がこのQ/Aを見ても確かにそれを修正しなかったと確信しています。いいえ、それは数分前に起こったことはありませんでした。 ;) –

関連する問題