1

Mount&Blade というゲームを改造しています。現在、カスタム シェーダーを介してライトマッピングを実装しようとしています。

ゲーム内フォーマットではモデルごとに複数の UV マップが許可されず、重複しない 2 番目のパラメーター化の情報をどこかに運ぶ必要があるため、4 つのフィールドuints(RGBA、頂点ごとのカラーリングに使用) が私の唯一の可能性。

最初はそのまま使おうと思っU,V=R,Gたが精度がいまいち。現在、座標ごとに 2 つのフィールド (16 ビット) を使用して、利用可能な最大精度でそれらをエンコードしようとしています。私の Python エクスポーターの抜粋:

def decompose(a):
  a=int(a*0xffff)     #fill the entire range to get the maximum precision
  aa  =(a&0xff00)>>8  #decompose the first half and save it as an 8bit uint
  ab  =(a&0x00ff)     #decompose the second half
  return aa,ab

def compose(na,nb):
    return (na<<8|nb)/0xffff

HLSL (DX9、シェーダー モデル 2.0) で 2 番目の部分 (構成またはアンパック) を行う方法を知りたいです。ここに私の試みがありますが、うまくいきません:

  //compose UV from n=(na<<8|nb)/0xffff
  float2 thingie = float2(
      float( ((In.Color.r*255.f)*256.f)+
               (In.Color.g*255.f)        )/65535.f,
      float( ((In.Color.b*255.f)*256.f)+
               (In.Color.w*255.f)        )/65535.f
  );
  //sample the lightmap at that position
  Output.RGBColor = tex2D(MeshTextureSamplerHQ, thingie);

提案や独創的な代替案は大歓迎です。

4

1 に答える 1

1

a を分解した後、aa と ab を正規化することを忘れないでください。このようなもの:

(u1, u2) = decompose(u)
(v1, v2) = decompose(v)
color.r = float(u1) / 255.f
color.g = float(u2) / 255.f
color.b = float(v1) / 255.f
color.a = float(v2) / 255.f

ピクセル シェーダー:

float2 texc;
texc.x = (In.Color.r * 256.f + In.Color.g) / 257.f;
texc.y = (In.Color.b * 256.f + In.Color.a) / 257.f;
于 2013-03-17T10:58:36.303 に答える