HSLS float1,...,float4及其字段

时间:2017-10-05 03:09:15

标签: directx-11 hlsl

我看到HSLS在float(1-4)和很多字段(r,rr,rrrr,arar,...)之后有浮点数和一个数字(我在{{3}的帮助下看到这些字段感谢Tim Jones:D - 我无法想象(现在)我们如何在没有这个工具的情况下编程HSLS)。

我试图找到有关此数据类型及其字段的参考资料,但我找不到任何关于它的信息(为什么数字1-4及其字段的含义。在C ++中浮点数只是浮点数,在这里,什么是浮动)

以下是我目前的进展:

根据HLSL Tool

  

float - 32位浮点值。

     

例如,这是一个4分量符号规范化的浮点变量声明。

     

snorm float4 fourComponentIEEEFloat;

它没有回答我的问题:这段代码是什么意思

RWTexture2D<float4> testTexture         : register(u0);

[numthreads(@value( threads_per_group_x ), @value( threads_per_group_y ), @value( threads_per_group_z ))]
void main
(
    uint3 gl_LocalInvocationID : SV_GroupThreadID,
    uint3 gl_GlobalInvocationID : SV_DispatchThreadId
)
{
    testTexture[gl_GlobalInvocationID.xy].xyzw = float4( float2(gl_LocalInvocationID.xy) / 16.0f, 0.0f, 1.0f );
}

我可能会略微理解float2(gl_LocalInvocationID.xy)是2 float

testTexture[gl_GlobalInvocationID.xy].xyzw = float4( float2(gl_LocalInvocationID.xy) / 16.0f, 0.0f, 1.0f );

相等

testTexture[gl_GlobalInvocationID.xy].xyzw = float4(gl_LocalInvocationID.x / 16.0f, gl_LocalInvocationID.y / 16.0f, 0.0f, 1.0f);

但我不知道它是否正确,旁边,r rr,rrrr,arar等字段如何...我之前提到过。

感谢阅读。

1 个答案:

答案 0 :(得分:2)

这些字段不是真正的字段,而是Source Register Swizzling(doc)。

float4是一个四分量浮点矢量,其中的分量是x,y,z和w。由于float4通常也用作颜色,因此这些组件也可以通过r,g,b和a来解决(所以.xyzw相当于.rgba)。

源代码调整使您可以内联交换,缩小或重复组件,因此,如果您只需要float3 vec的xy组件,则只需编写vec.xy而不是float2(vec.x, vec.y)。如果您想要交换float4 color的颜色通道进行某些计算,您可以轻松编写color.bgra来交换红色和蓝色组件。最后,您还可以复制频道,例如vec.xxxx,以便在所有四个组件中获得float4 vec.x。也允许组合这些方法,例如vec.yzxx