4

Ardor3D の地形システムを SM3.0 ハードウェアで動作させようとしています。

現在の GLSL フラグメント シェーダーは、均一な vec2 配列を使用して、xy 座標の配列をフラグメント シェーダーに渡します。

動的インデックス付き一様配列は SM4.0+ ハードウェアでのみ動作するため、SM3.0 で実行するには、1D float テクスチャに置き換える必要があります。

現在の配列は次のようになります。 uniform vec2 sliceOffset[8];

次のようにアクセスします。 vec2 offset = sliceOffset[int(unit)];

私は OpenGL と GLSL の経験が豊富なので、変換に問題があります。

1D テクスチャを作成します - 幅 = 8 - フォーマット = RGBA32F

テクスチャ用の 1D バッファを作成する

  • width = 8 * 4 = 32 float、または 32 * 4 = 32 バイト大
  • 次のようにフロート バッファを埋めます。

[x0,y0,0,0,x1,y1,0,0,x2,y2,0,0,x3,y3,0,0,x4,y4,0,0,x5,y5,0,0,x6,y6,0,0,x7,y7,0,0]

テクスチャの 1D サンプラーを作成する

  • 最小フィルター = 最も近い、ミップ マップなし
  • マグフィルター = 最も近い
  • ラップ モード = エッジにクランプ

GLSL では、サンプラーを次のように定義します。 uniform sampler1D sliceOffset;

そしてそれにアクセスします:

vec2 getSliceOffset(float unit)
{
 float texCoord = (unit * 2.0f + 1.0f) / (2.0f * 8.0f);
 vec2 offset = texture1D(sliceOffset, texCoord);
 return offset;
}

しかし、それは壊れています。

私は何を間違っていますか?

4

2 に答える 2

1

texCoord の計算は正しいです。(単位 + .5) / 8.0 を実行するので最初は戸惑いましたが、同じです。

それでも気になることが一つ。texFetch は vec4 になるので、サンプラー ステートメントの最後に .rg を記述する必要はありませんか? あなたのコンパイラがそれについて不平を言っていないことに驚いています。

試す:

texture1D(sliceOffset, texCoord).rg;
于 2010-12-04T12:29:47.157 に答える
1

あなたが示しているものはすべて正しく見えます。ただし、「壊れている」はあまり説明的ではありません。症状は何ですか?

間違っている可能性がある、表示されていないもの:

  • 同じテクスチャ ユニットを使用する 2 つのサンプラー。
  • テクスチャ データのタイプの問題 (ただし、経験があれば、疑わしいと思います)

あなたが試すことができるもう1つのこと: 高さ= 1だけで、代わりにtexture2dを使用してください。DX は 1D テクスチャのサポートを必要としないため、ハードウェアによっては、DX の OpenGL サポートがエミュレートされる場合があります。そのようなエミュレーションから離れようとすることができます。

于 2010-12-04T08:12:22.333 に答える