2

ジオメトリ シェーダーをリンクしようとすると、次のエラーがスローされます。

0(76) : error C5041: cannot locate suitable resource to bind variable "triTable". Possibly large array.

シェーダーで宣言されたこの配列を参照すると、次のようになります。

    const int triTable[256][16] =
    { { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    { 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    { 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    ...
    ...
    ...
    { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } };

配列はかなり大きいです。これは、シェーダー内で宣言するには配列が大きすぎることに関係していますか?それとも他の問題がありますか?

4

2 に答える 2

3

Triangle データは、定数 (またはユニフォーム) にあることを意図していません。

はい、データが大きすぎて配列に収まりません。OpenGL を使用する場合、均一なデータやその他の種類のデータにはハードウェアの制約があります。

できれば三角形データを頂点配列オブジェクトに入れ、それを使用してレンダリングする必要がありますが、何らかの理由でシェーダーを呼び出すたびに三角形データを使用できるようにしたい場合は、頂点をテクスチャにエンコードすることでこの機能を得ることができます。均一な配列で、シェーダー内のテクスチャからフェッチするだけです。

一般に、テクスチャは、シェーダー呼び出し間で大量の定数データが​​必要になるという問題を解決します。

おそらく頂点データに使用するものであるフロート テクスチャ フォーマットを取得できることに注意してください。

于 2015-03-26T01:42:19.407 に答える
0

いくつかのオプションがあります:

  1. データを頂点バッファー オブジェクトに格納し、頂点配列で頂点属性形式を指定します。
  2. データを 1D テクスチャに保存します。ただし、この方法は、グラフィック カードによってはテクスチャ サイズの制限を受けます。glGetInteger(GL_MAX_TEXTURE_SIZE, &size); を使用して確認してください。GT750M が 16384 (テクセル単位) を返す
  3. 上記の制限を超えてより多くの三角形データを保存する場合は、テクスチャ バッファ オブジェクトに頼ることができます。テクセルの数を数億までスケーリングします。glGetInteger(GL_MAX_TEXTURE_BUFFER_SIZE, &size); を使用して、グラフィック カードの制限を確認してください。
于 2015-03-27T18:04:27.553 に答える