OpenTKでC#を使用してOpenGL APIにアクセスしています。私のプロジェクトでは、テッセレーションを使用して高さマップを描画しています。私のテッセレーションコントロールシェーダは正方形を64個の四角形のグリッドに分割し、私のテッセレーション評価シェーダはそれらのポイントに垂直方向のオフセットを追加します。垂直方向のオフセットは、このような均一なフロートバッファに格納されています。私は、AMDのRadeon 8250 GPUと私のラップトップ上でプロジェクトを実行するときNvidia GPUのバッファサイズが均一
uniform float HeightmapBuffer[65 * 65];
すべてが、正常に動作します。問題はNvidiaグラフィックカードで実行しようとすると始まります。私は古いGT 430とブランドの新しいGTX 1060を試してみましたが、結果は同じです。
Tessellation evaluation info
----------------------------
0(13) : error C5041: cannot locate suitable resource to bind variable "HeightmapBuffer". Possibly large array.
私はこの問題を調査したように、私は両方のNvidiaのチップにAMDと65.54 kBの上〜500メガバイトを返すGL_MAX_UNIFORM_BLOCK_SIZE
変数を見つけました。私の配列は実際には16.9 kBしか使用しないので、少し奇妙です。したがって、 "ブロックサイズ"が実際に1つの変数のサイズを制限するかどうかはわかりません。 1つのシェーダーに渡されるすべてのユニフォームのサイズが制限されるのでしょうか?それでも、私のプログラムが65 kBを使うとは思えません。
私はまた、テクスチャを使用して「共通の」道を行くことを試みますが、私は、補間に問題があったと思うので、一緒に隣接する二つのハイトマップを配置する際に、境界が一致しませんでした。反対側に一様なバッファ配列があれば、物事は完全に機能します。
のでGL_MAX_UNIFORM_BLOCK_SIZE
の実際の意味は何ですか?なぜNvidia GPUのこの価値は低いのですか?私のシェーダに大きな配列を渡す方法はありますか?
あなたは '4バイト* 4 * 65 * 65' =' 67.6 KiB'を持っているので、 'float'ユニフォームは実際に' vec4'の大きさです。 – genpfault
Hrm、私はGL仕様でその情報を調達するのに苦労しているので、塩の穀物でそれを取る。私はES 2.0仕様を覚えているかもしれません。 – genpfault
[大規模配列のジオメトリシェーダのエラー](https://stackoverflow.com/questions/29262469/error-in-geometry-shader-from-large-array)の可能な複製 – Gusman