这不是“纹理数组”。这只是一种声明 5 个单独绑定的纹理的方法,语法允许您使用索引来选择t0
通过t1
. “纹理数组”声明如下:
Texture2DArray textures : register(t0);
纹理数组中的每个纹理必须具有相同的格式(它是单个资源),并且您使用 afloat3
对其进行索引以进行采样。
float4 color = textures.Sample(someSampler, float3(p.UV,0) );
您在上面所做的基本上与以下内容相同:
Texture2D texture0 : register(t0);
Texture2D texture1 : register(t1);
Texture2D texture2 : register(t2);
Texture2D texture3 : register(t3);
Texture2D texture4 : register(t4);
因此,每个纹理的格式是完全独立的,这里的代码:
float R = textures[0].Sample(someSampler, p.UV).r;
这只是像平常一样对纹理进行采样t0
,只返回红色通道。对于 BC4,这将导致硬件解压缩正确的 4x4 块(或块取决于 UV 和采样器模式),并从重建中返回红色通道。
如果您是 DirectX 和 HLSL 的新手,我强烈建议您不要使用 DirectX 12 开始。这是一个为图形专家设计的相当无情的 API,因此您应该考虑从 DirectX 11 开始。API 都驱动相同的硬件,只是使用不同的程序员抽象来实现。DirectX 12 文档通常还假设您已经是 DirectX 11 的专家,并且 HLSL 的使用基本相同(添加了对根签名的编程控制)。请参阅DirectX 11和DirectX 12的DirectX 工具包。