作为HLSL爱好者,我一直习惯于使用(float)(x> = y)。通常用于0/1乘法以避免分支。我只是重新访问了自己的固有列表,并看到了step(x,y)。在我看来,它们的输出相当。
有没有理由更喜欢这些样式中的一种?
答案 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通道矢量比较。