私の質問はこれに近いものです。ATI グラフィックス カードの GLSL シェーダの頂点均一コンポーネントの実際の数は?
彼の場合、
- 彼の GL_MAX_VERTEX_UNIFORM_COMPONENTS は 4096 でした
- 彼は mat4[] 配列を使用していました
- 64 mat4 未満ではシェーダーは問題なく、それ以上では問題ありません
amd カードの wikiに書かれているように、正しい値を得るには、4 で割る必要があります。
mat4 は 16 フロートなので、16 で割ると、1024/16 = 64 mat4 になります。
したがって、制限は彼の使用と一貫しています。
しかし、それは私のものではありません。ここに私が持っているものがあります:
- GL_MAX_VERTEX_UNIFORM_COMPONENTS: 16384
- vec3 の配列
ベクトルを使用して立方体のインスタンスを変換しているため、ベクトルの数は glDrawArraysInstanced() に渡されるインスタンスの数と同じです。コードは本当に単純ですgl_Position = vp * translateVec[gl_InstaceID] * pos
(vp は一意の ViewProjection マトリックスです)。ベクトルが 256 未満の場合、立方体は正しく変換されます。256 個のベクトルを超えると、最初の 256 個の立方体は問題ありませんが、他のすべての立方体は問題ありません。それらは (0, 0, 0) ポイントにあり、ベクトルが (0, 0, 0) のように見えます。
私は amd 6490m を持っているので、彼と同じように、4 ステップで除算する必要があります 16384/4 = 4096 フロート
ウィキによると、ベクター アーキテクチャのため、「各ユニフォームは 4 つのコンポーネントを使用すると想定する必要があります」。これは、vec3 が 3 つではなく 4 つのコンポーネントを使用することを意味します。
したがって、4096/4 = 1024 vec3
ご覧のとおり、それは私の観察と一貫性がありません。
私は何が欠けていますか? また、GL_MAX_UNIFORM_VECTORS (私にとっては 4096) はどうですか?
注: vec3 配列をアップロードし、配列はCore プロファイル 4.2、 win7、13.1 CatalystglUniform3fv()
で宣言されています。uniform vec3[255]