Попытка обратить вспять HLSL Pixel Shader - PullRequest
1 голос
/ 13 апреля 2020

Я изучаю язык HLSL и у меня есть код на ассемблере, который я пытаюсь изменить:

mul r0.x, cb0[11].z, cb1[69].w
frc r0.x, r0.x
add r0.y, r0.x, l(0.500000)
frc r0.y, r0.y
add r0.z, r0.y, l(0.250000)
frc r0.z, r0.z
add r0.w, r0.z, l(0.500000)
frc r0.w, r0.w
mul r1.x, r0.w, l(6.283185)
sincos null, r1.x, r1.x

И вот что я написал, когда попытался стереть код на ассемблере:

float3 ps_main( const PixelInput pixel ) : SV_TARGET
{
    float4 Scroll;
    Scroll.x = frac(colorScroll.z * gameTime.w);
    Scroll.y = frac( Scroll.x + 0.5f);
    Scroll.z = frac( Scroll.y + 0.25f);
    Scroll.w = frac( Scroll.z + 0.5f);

    float3 ScollSpeed =  Scroll.w * 6.283185f;

    return ScollSpeed;
}

Но при компиляции генерируется следующий код сборки:

dcl_temps 1
mul r0.x, cb0[11].z, cb1[69].w
frc r0.x, r0.x
add r0.x, r0.x, l(0.500000)
frc r0.x, r0.x
add r0.x, r0.x, l(0.250000)
frc r0.x, r0.x
add r0.x, r0.x, l(0.500000)
frc r0.x, r0.x
mul o0.xyz, r0.xxxx, l(6.283185, 6.283185, 6.283185, 0.000000)
ret 

Почему все мои переменные r0.x? Я хочу, чтобы Scroll.y был r0.y, как в оригинальной сборке.

1 Ответ

0 голосов
/ 17 апреля 2020

Компилятор оптимизирует ваш код для оптимизации использования регистра, так как в конце вы используете только компонент w, xyz может быть упакован в один скаляр:

float3 ScollSpeed =  Scroll.w * 6.283185f;

он обнаруживает, что ScollSpeed.xyz не требуется, и может быть упакован в один float (следующий код будет эквивалентен):

float3 PS(  ) : SV_TARGET
{
    float Scroll;
    Scroll = frac(colorScroll.z * gameTime.w);
    Scroll = frac( Scroll + 0.5f);
    Scroll = frac( Scroll + 0.25f);
    Scroll = frac( Scroll + 0.5f);

    float3 ScollSpeed =  Scroll * 6.283185f;

    return ScollSpeed;
}

тогда ему нужен только первый компонент регистра для выполнения всей операции (следовательно, поэтому у вас есть только r0. х)

...