取消/打包另外一组UV坐标到32位RGBA字段

时间:2013-03-10 20:34:06

标签: graphics shader blender hlsl directx-9

我正在修改一款名为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);

欢迎任何建议或巧妙的替代方案。

1 个答案:

答案 0 :(得分: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;