2011-09-22 42 views
1

晚上好,如何創建有效的維度

我想一個XMFLOAT3X3發送到常量緩衝區常量緩衝區(見下面的代碼)。

ZeroMemory(&constDesc, sizeof(constDesc)); 
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
constDesc.ByteWidth = sizeof(XMFLOAT3X3); 
constDesc.Usage = D3D11_USAGE_DEFAULT; 

result = m_pDevice->CreateBuffer(&constDesc,0,&m_pTexTransformCB); 

if (FAILED(result)) { 
    MessageBoxA(NULL,"Error creating constant buffer m_pTexTransformCB", "Error", MB_OK); 
    return false; 
} 

但是,編譯器告訴我,XMFLOAT3X3是恆定的緩衝bytewidth無效尺寸:

D3D11: ERROR: ID3D11Device::CreateBuffer: The Dimensions are invalid. For ConstantBuffers, marked with the D3D11_BIND_CONSTANT_BUFFER BindFlag, the ByteWidth (value = 36) must be a multiple of 16 and be less than or equal to 65536. [ STATE_CREATION ERROR #66: CREATEBUFFER_INVALIDDIMENSIONS ] 

不過,我有點新HLSL,所以我不知道如果我將字節寬度設置爲48,着色器cbuffer中的float3x3將正確註冊。我應該如何處理這個最好的?

如果您需要更多信息,請發表評論,我將編輯該問題。我希望這很清楚。

回答

5

在你的情況下,你可以改變ByteWidth爲48,它會沒事的。如果您想將多個值組合在一起,則需要確保數據對齊到16個字節的邊界。爲此,您可以在定義結構之前添加__declspec(align(16))。

__declspec(align(16)) 
struct Data 
{ 
    XMFLOAT3X3 a; 

    //other stuff here 
}; 

這樣你可以使用sizeof(Data)並保證你的ByteWidth將是有效的。我很抱歉給你一個不正確的答案,你不需要手動填充。

3

「如果綁定標誌D3D11_BIND_CONSTANT_BUFFER,你必須在16的倍數設定ByteWidth值」
MSDN ,尤其是言論。

相關問題