我正在修改一款名为 Mount&Blade 的游戏,目前正在尝试通过自定义着色器实现光照贴图。
由于游戏中的格式不允许每个模型超过一个 UV 贴图,并且我需要在某处携带第二个非重叠参数化的信息,因此我的字段为四个uints
(RGBA,用于每个顶点着色)唯一的可能。
起初考虑只是使用U,V=R,G
,但精度不够好。现在我正在尝试以可用的最大精度对它们进行编码,每个坐标使用两个字段(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)中执行第二部分(组合或解包)。这是我的尝试,关闭,但不起作用:
//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);
欢迎任何建议或巧妙的替代方案。