在C++与Hlsl绑定Cbuffer数据的时候,非常容易出错,出错的根本原因是C++对数据结构内存的分配与hlsl不同。
重要:HLSL的结构体struct其实并不管你是一个变量还是几个变量,它就是按照一次放满一个float4的内存长度,多少变量都往一个float4里面塞,塞满了再接着塞下一个float4。测试结果显示:cbuffer的长度必须是float4的整数倍才行,不知道float+float3的这种组合是否可以正常获取数据,也不清楚float+float+float3+float3这种组合能不能正常分配到数据,关键取决于GPU的内存分配规则。
在进入渲染管道后,如果CPU出现了要修改buffer或者其它类型数据的时候,不可能重新new一个buffer塞进去。这个时候需要一种机制能够修改已经进入管道的数据,这种机制就是Map和Unmap机制。其本质就是对数据加锁导致GPU不能修改,然后CPU对其进行修改,