簡體   English   中英

Direct3D11緩沖區對齊要求

[英]Direct3D11 buffer alignment requirements

什么是Direct3D11對各種ID3D11Buffer用途的預期對齊/填充(或在文檔中,我只在MSDN上發現了一些模糊的片段,如“如有必要,包括任何包裝”和“ ... D3D11_BUFFER_DESC的ByteWidth值,以16的倍數”)。頂點和常量緩沖區)?

例如,當將D3D11_APPEND_ALIGNED_ELEMENT用於與頂點着色器一起使用的輸入布局時,對對齊的期望是​​什么? 最初,我認為任何矢量類型都希望是16字節對齊的,但是事實並非如此。 實際上,似乎甚至沒有針對整個對象的對齊期望,至少對於float類型超出了4個字節(沒有試圖迫使編譯器未對齊單個基元)。

例如

D3D11_INPUT_ELEMENT_DESC inputDesc[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
//Seems to expect something like
struct Vertex
{
    float float float
    float float float float
    float float
};
//Rather than
__declspec(slign(16)) struct Vertex
{
    float float float padding
    float float float float
    float float padding padding
};
//HLSL
struct Input
{
    float4 pos : POSITION;
    float4 color : COLOR;
    float2 uv : TEXCOORD0;
};

就常量而言,甚至還有一個D3D11_INPUT_ELEMENT_DESC,但是仍然存在確保HLSL結構聲明和C ++匹配的問題。

您正在從錯誤的一端接近它。 永遠不要嘗試對C ++代碼中的輸入布局進行硬編碼-這只是維護的噩夢,因為每次更改着色器時都必須對其進行更改,並且當您擁有足夠的着色器時,對每個布局進行硬編碼就變得不可行了。一個。

相反,請查看D3DReflect API:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd607334%28v=vs.85%29.aspx

基本上,您可以檢查已編譯的着色器並直接從其讀取輸入布局,而不用手動指定它。 您還可以讀取輸入名稱,從而可以僅使用着色器所需的那些值動態創建頂點緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM