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

Step vs. comparison operator in HLSL?

作为HLSL爱好者,我一直习惯使用(float)(x>=y)。通常用于避免分支的 0/1 乘法。我刚刚重新访问了我的内在列表并看到了 step(x,y)。对我来说,它们的输出听起来是一样的。

有什么理由比另一种更喜欢这些样式中的一种吗?

我认为它们是等价的。这个着色器:

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 通道向量比较中。