HLSL
+ -

6.4.2 HLSL纹理缓冲区

2024-06-26 14 0

由于常量缓冲区针对小尺寸和统一的访问模式进行了优化,因此在某些情况下,它们可能具有未知期望的性能特性。一种常见的情况是用于蒙皮的骨骼矩阵阵列。在这种情况下,每个顶点都包含一个或多个索引,指示阵列中的哪个骨骼应用于变换位置和法线。在许多硬件类型上,这种访问模式将导致执行着色器程序的线程序列化对骨骼数据的访问,从而停止执行。

为了纠正这个问题,D3D11允许一种特殊类型的常量缓冲区,称为纹理缓冲区。纹理缓冲区使用与着色器程序中声明常量和访问常量相同的语法。然而,在后台,内存访问将通过纹理获取管道完成。因此,它将具有与纹理样本相同的缓存异步访问模式。
清单6.15演示了顶点着色器程序中纹理缓冲区的声明和使用

cbuffer VSConstants : register(cb0)
{
    float4x4 WVPMatrix;
}
tbuffer Bones : register(t0)
{
    float4x4 BoneMatrices[256];
}

float4 VSMain( in float4 VtxPosition : POSITION,
    in uint Bonelndex : BONEINDEX ) : SV_Position
{
    float4x4 boneMatrix = BoneMatrices[BoneIndex];
    float4 skinnedPos = mul( VtxPosition, boneMatrix );
    return mul( skinnedPos, WVPMatrix );
}

声明纹理缓冲区时需要记住的一个重要点是,它必须映射到纹理寄存器,而不是常量缓冲寄存器。此外,主机应用程序必须为纹理缓冲区创建着色器资源视图,并通过SSetShaderResource将其绑定,而不是调用SSetConstantBuffers。纹理缓冲区资源本身也必须创建为纹理资源,而不是缓冲区资源

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!