DirectX11--HLSL常量缓冲区打包规则

HLSL常量缓冲区打包规则

DirectX11 With Windows SDK完整目录:https://blog.youkuaiyun.com/x_jun96/article/details/80293670

尽管打包规则并不复杂,但是稍不留意就可能会导致因为打包规则的不理解而产生的数据错位问题。

下面会使用大量的例子来进行描述,并对有争议的部分使用图形调试器来反汇编着色器代码加以验证。

1. C++中的结构体数据是以字节流的形式传输给HLSL的

例1.1

若C++结构体和HLSL常量缓冲区如下:

// cpp
struct S1
{
   
   
    XMFLOAT3 p1;
    XMFLOAT3 p2;
};

// HLSL
cbuffer C1
{
   
   
    float4 v1;
    float4 v2;
}

则最终C1两个向量接收到的数据如下:
(p1.x, p1.y, p1.z, p2.x)
(p2.y, p2.z, empty, empty)

2. HLSL常量缓冲区中的向量不允许拆分

例2.1

// cpp
struct S1
{
   
   
    XMFLOAT3 p1;
    XMFLOAT3 p2;
};

// HLSL
cbuffer C1
{
   
   
    float3 v1;
    float4 v2;
}

v1将被单独打包成一个4D向量,确保常量缓冲区的内存按128位对齐。

C1的内存布局为:

(v1.x, v1.y, v1.z, empty)
(v2.x, v2.y, v2.z, v2.w)

这时用S1结构体的数据再传输给C1,结果如下:

(p1.x, p1.y, p1.z, p2.x)
(p2.y, p2.z, empty, empty)

例2.2

// HLSL
cbuffer C1
{
   
   
    float2 v1;
    float4 v2;
    float2 v3;
}

v2无法拆分来填充v1的空位,而是单独起一行向量,这样C1的内存布局为:

(v1.x, v1.y, empty, empty)
(v2.x, v2.y, v2.z, v2.w)
(v3.x, v3.y, empty, empty)

3. HLSL常量缓冲区中多个相邻的变量若有空缺则优先打包进同一个4D向量中

例3.1

// HLSL
cbuffer C1
{
   
   
    float v1;
    float2 v2;
    float v3;
    float2 v4;
    float v5;
}

C1的内存布局为:

(v1.x, v2.x, v2.y, v3.x)
(v4.x, v4.y, v5.x, empty)

打包顺序是从最上面的变量开始往下的。

例3.2

// HLSL
cbuffer C1
<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值