Преобразование ассемблера пиксельных шейдеров в HLSL

Я пытаюсь преобразовать встроенный пиксельный шейдер asm ps+mov3 обратно в HLSL и застрял на одной инструкции, для которой не могу найти никакой документации. Инструкция +mov, и такой модификатор не указан в модификаторы. Я перевел его в простое задание, но визуализированная сцена тогда выглядит по-другому. Возможно, другие мои переводы тоже неверны.

Полный ассемблерный код:

Sampler[0] = (DiffuseMapSampler);
pixelShader = asm
{
    ps_1_3
    tex t0
#ifdef _POINTLIGHT_
    add r0.rgb, v0, v0
    +mov r0.a, v0.a
    mul_x4 r0, t0, r0
#else
    mul_x4 r0, t0, v0
#endif
#if defined(OVERGROWTH) && HASALPHA2MASK
    mul_x2 r0.a, r0.a, t0.a
#endif
};

Структура и семплер

struct VS_OUTPUT
{
    float4 Pos  : POSITION0;
    float2 Tex0 : TEXCOORD0;
#if _HASSHADOW_
    float4 TexShadow    : TEXCOORD1;
#endif
    float4 Color  : COLOR0;
    float Fog   : FOG;
};

texture DiffuseMap;
sampler DiffuseMapSampler = sampler_state
{
    Texture = (DiffuseMap);
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    AddressU  = WRAP;
    AddressV  = WRAP;
    MipMapLodBias = 0;
};

Мой перевод HLSL

float4 basicPixelShaderNoShadow(VS_OUTPUT VsOut) : COLOR
{
    float4 diffuseMap = tex2D(DiffuseMapSampler, VsOut.Tex0);
    float4 outCol;
#ifdef _POINTLIGHT_
    outCol.rgb = VsOut.Color.rgb * 2;
    outCol.a = VsOut.Color.a;
    outCol = diffuseMap * outCol * 4;
#else
    outCol = diffuseMap * VsOut.Color * 4;
#endif

#if defined(OVERGROWTH) && HASALPHA2MASK
    outCol.a *= 2 * diffuseMap.a;
#endif
    return outCol;
}

person Mats391    schedule 23.01.2021    source источник


Ответы (1)


+mov означает "параллельно". Нашел пример для этого здесь . Различия в рендеринге связаны с изменением версии ps. HLSL был установлен на ps_2_a, и при использовании ps+mov3 для него также все рендерится так же, как и с asm.

person Mats391    schedule 23.01.2021