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