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