Нестандартная битовая упаковка HLSL работает неправильно - PullRequest
0 голосов
/ 17 ноября 2018

Я немного новичок в Directx, но я пытался заставить этот пользовательский пакет битов работать весь день.Я пытаюсь упаковать float4 и другой float в uint.Float4 - это цвет, а float - значение глубины.Я хочу использовать 6 бит каждый для цвета, а остальные 8 бит для глубины.Точность не важна.Я думал, что понял, что я делаю, но при распаковке он просто возвращает все нули.Это вообще возможно?Пиксельный формат: R16G16B16A16_FLOAT.

Вот код

uint PackColorAndDepthToUint(float4 Color, float Depth)
{

    uint4 u = (int4) (Color * float4(255, 255, 255, 1.0f));
    uint packedOutput = (u.a << 26) | (u.b << 20) | (u.g << 14) | (u.r << 8) | asuint(Depth * 255);
    return packedOutput;
}

void UnpackColorAndDepthFromUint(uint packedInput, out float4 Color, out float Depth)
{
    uint d = (packedInput & 255);
    Depth = ((float) d / 255);
    uint r = (((packedInput >> 8)) & 64);
    uint g = (((packedInput >> 14)) & 64);
    uint b = (((packedInput >> 20)) & 64);
    uint a = (((packedInput >> 26)) & 64);
    uint4 co = uint4(r, g, b, a);

    Color = (((float4) co) / float4(255, 255, 255, 1.0f));
}

, если кто-нибудь может указать мне правильное направление, я был бы признателен за это!

...