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);
提案や独創的な代替案は大歓迎です。