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;
}
しかし、それは壊れています。
私は何を間違っていますか?