我创建了一个Math,它保存着顶点坐标的位置,我想知道DirectX如何能够在不知道成员值的名称的情况下读取结构的成员,或者能够使用它们作为输入,尽管它们是私有的。
示例:
//The values can be used for input despite being private
class Math3
{
public:
Math3() {}
Math3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
private:
float x;
float y;
float z;
};发布于 2022-01-22 20:31:06
private vs public只适用于C++代码,并由编译器强制执行。Math3实例只是内存中12个字节的块,没有特殊的硬件保护。
换句话说,从“内存中”的角度来看,如果Math3是:
class Math3
{
public:
float x;
float y;
float z;
};
// this is the same as
struct Math3
{
float x;
float y;
float z;
}如果在类上执行sizeof,则相同。
顶点缓冲区只是一个内存块。GPU在创建输入布局时,从输入布局描述中了解数据类型、大小、填充等信息。
const D3D11_INPUT_ELEMENT_DESC InputElements[] =
{
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};如果向您的
Math3类添加了一个virtual方法,那么内存的布局将发生变化,它将不再“仅起作用”。
输入汇编程序获取主动输入布局,并使用它解析一个或多个顶点缓冲区中的顶点信息。因此,它能够理解各种复杂的布局,甚至能够在运行时从多个缓冲区合并。
最后,重要的是,对于输入布局所描述的顶点数据,代码使用相同的“内存中”组织,并且顶点缓冲区本身也尊重该组织.。
https://stackoverflow.com/questions/70816850
复制相似问题