contant buffer中的packoffset

       “在DirectX10中不使用Effect框架处理Shader与程序间的数据传递”中,有些cbuffer中的变量定义后带有packoffset(c#)这里简单介绍一下这个packoffset。

    通过使用packoffset 可以指定变量存储在constant buffer中的特定位置。

    在hlsl中,默认是按float4来对齐数据的。例如两个float2实际上就是一个float4四字对齐一个寄存器就表示一个float4,如c0,float4中的元素可以通过c0.x,c0.xyz这样的方法来使用。

    具体来看"HLSLWithoutFX10 Sample"中的例子,在C++文件中有如下结构定义,这个结构用于给constant buffer填充数据:

复制代码
struct VS_CONSTANT_BUFFER
{
    D3DXMATRIX mWorldViewProj;      
    
//mWorldViewProj will probably be global to all shaders in a project.
    
//It's a good idea not to move it around between shaders.

    D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
    float fSomeFloatThatMayBeNeededByASpecificShader;
    
    float fTime;       
    
//fTime may also be global to all shaders in a project.

    float fSomeFloatThatMayBeNeededByASpecificShader2;
    float fSomeFloatThatMayBeNeededByASpecificShader3;
};
复制代码

在HLSL中:

复制代码
cbuffer cb0
{
    row_major float4x4 mWorldViewProj : packoffset(c0);     
    
// World * View * Projection transformation

    float fTime : packoffset(c5.y);  
    
// Time parameter. This keeps increasing
    
// Notice, that this parameter is placed in c5.y.
    
// If it were packed by the default packing rules, 
    
// it would be placed in c4.x
};
复制代码

对比一下加上注释就很明白了。

在cb0中,第一个mWorldViewProj:packoffset(c0)表示将会在这个cbuffer中的c0位置开始存储mWorldViewProj,共使用c0,c1,c2,c3。

    第二个fTime在默认情况下应该是存放于c4.x中,但是这里写的是c5.y?

VS_CONSTANT_BUFFER:

D3DXMATRIX mWorldViewProj

D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader

float fSomeFloatThatMayBeNeededByASpecificShader

float fTime

发现在fTime前有一个D3DXVECTOR4与float。关键就在这里,D3DXVECTOR4占据了c4,float占据了c5.x,所以fTime就是c5.y了。

另可以参考DirectX sdk中的“Packing Rules for Constant Variables

posted on   chsaov  阅读(753)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

导航

< 2009年2月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
1 2 3 4 5 6 7
8 9 10 11 12 13 14

统计

点击右上角即可分享
微信分享提示