DirectX 11中顶点缓冲区描述如何读取输入数据?

How Does Vertex Buffer Description Read Input Data in DirectX 11?

我创建了一个保存顶点坐标位置的数学结构,我想知道 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;
};

privatepublic 仅适用于 C++ 代码并由编译器强制执行。 Math3 的实例只是内存中的一个 12 字节块,没有特殊的硬件保护。

换句话说,从 'in-memory' 的角度来看,如果 Math3 是完全相同的:

class Math3
{
public:
    float x;
    float y;
    float z;
};

// this is the same as
struct Math3
{
    float x;
    float y;
    float z;
}

如果你在 class 上做一个 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 },
};

If you added a virtual method to your Math3 class, then the layout of the memory would change and it would no longer 'just work'.

Input Assembler 获取活动的 Input Layout 并使用它从一个或多个顶点缓冲区中解析出顶点信息。因此,它能够理解各种复杂的布局,甚至在运行时从多个缓冲区合并。

最后,重要的是您的 C++ 代码使用与输入布局所描述的相同 'in-memory' 顶点数据组织,并且您的顶点缓冲区本身尊重该组织。