我創建了一個數學結構來保存頂點坐標的位置,我想知道 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;
};
uj5u.com熱心網友回復:
privatevspublic僅適用于 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 },
};
如果你
virtual在你的類中添加了一個方法Math3,那么記憶體的布局就會改變,它不再“正常作業”。
Input Assembler 采用活動輸入布局并使用它從一個或多個頂點緩沖區中決議頂點資訊。因此,它能夠理解各種復雜的布局,甚至可以在運行時從多個緩沖區進行合并。
最后,重要的是您的 C 代碼對頂點資料使用與輸入布局所述相同的“記憶體中”組織,并且您的頂點緩沖區本身尊重該組織。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419330.html
標籤:
上一篇:如何從二進制流中讀取單個位元組?
下一篇:將成員函式作為模板引數傳遞
