2013-03-10 3 views
1

Я модирую игру под названием Mount & Blade, в настоящее время пытается реализовать lightmapping через пользовательские шейдеры.Un/pack дополнительный набор UV-координат в 32-битное поле RGBA

Поскольку в игровом формате не допускается использование более одной карты 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, Shader Model 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

Не забывайте нормализовать aa и ab после разложения a. Что-то вроде этого:

(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; 
+0

Это работает хорошо в OpenGL с использованием предварительного просмотра редактора. Похоже, проблема связана с гамма-движком игры, корректирующим ценности или что-то в этом роде. Спасибо, в любом случае, ответ правильный, и я очень ценю это. Работая над этой проблемой уже пару недель. Я думаю, что подхожу к нему под другим углом; Обрезка графического процессора. Кажется более перспективным, хотя и с некоторыми дополнительными накладными расходами. – Swyter