HLSL中的步进与比较运算符?

时间:2018-08-03 06:10:53

标签: hlsl intrinsics

作为HLSL爱好者,我一直习惯于使用(float)(x> = y)。通常用于0/1乘法以避免分支。我只是重新访问了自己的固有列表,并看到了step(x,y)。在我看来,它们的输出相当。

有没有理由更喜欢这些样式中的一种?

1 个答案:

答案 0 :(得分:1)

我认为它们是等效的。此着色器:

inline float test1( float x, float y )
{
    return (float)( x >= y );
}

inline float test2( float x, float y )
{
    return step( x, y );
}

float2 main(float4 c: COLOR0): SV_Target
{
    float2 res;
    res.x =  test1( c.x, c.y );
    res.y =  test2( c.z, c.w );
    return res;
}

编译为以下DXBC指令:

ps_4_0
dcl_input_ps linear v0.xyzw
dcl_output o0.xy
dcl_temps 1
ge r0.xy, v0.xwxx, v0.yzyy   // If the comparison is true, then 0xFFFFFFFF is returned for that component.
and o0.xy, r0.xyxx, l(0x3f800000, 0x3f800000, 0, 0)   // Component-wise logical AND, 0x3f800000 = 1.0f
ret

如您所见,编译器将两个内联函数都视为等效函数,甚至将它们合并在一起,然后合并为一个2通道矢量比较。