2013-05-27 52 views
4

語義的目的是什麼?D3D11中語義和頂點佈局的意義是什麼?

,如果我有一個頂點佈局是這樣的:

struct VS_Input 
{ 
    float4 position : COLOR; 
    float4 color : POSITION; 
}; 

請問它實際上事情,我改變了對兩個成員的語義?

如果我必須發送一個Direct3D每個頂點的結構,爲什麼不能按原樣複製我的數據?

如果我爲direct3D提供了一個佈局與着色器不匹配的頂點,會發生什麼?例如,如果我將以下頂點傳遞給上述着色器?

struct MyVertex 
{ 
    Vec4 pos; 
    Vec2 tex; 
    Vec4 col; 
}; 

在D3D文檔,它表示一個警告將進行生產,我的數據將被「重新詮釋」

這是否意味着「重新詮釋」爲reinterpret_cast的<>?像我的着色器會嘗試使用紋理座標和一半顏色作爲着色器中的顏色?或者是否會搜索我的頂點佈局以查找與每個語義匹配的元素,然後將輸入拖動到正確的位置以使着色器正常工作?

如果上述不符,那麼爲什麼D3D需要明確的頂點佈局?

回答

4

語義用於將頂點緩衝區綁定到着色器輸入。在D3D11中,你有緩衝區,它們只是存儲數據的內存塊,着色器有一個輸入簽名來描述他們期望的輸入,並輸入表示緩衝區和着色器之間綁定的佈局,並描述緩衝區中的數據如何解釋。語義的作用只是將緩衝區佈局描述中的元素與相應的着色器輸入進行匹配,只要匹配,名稱並不重要。

當您創建輸入佈局對象時,您需要正確指定頂點數據的佈局。如果您的輸入佈局與您的數據的內存中的實際佈局不匹配,那麼它將像使用reinterpret_cast一樣有效,並且會渲染垃圾。在輸入元素和着色器輸入之間提供正確的語義匹配,但它們將被正確綁定,而元素順序等內容並不重要。這是描述如何將來自頂點緩衝區的數據元素傳遞給着色器輸入的語義。

+0

謝謝。我假定頂點佈局和着色器結構必須對應1到1.另外,你必須爲變量和語義提供一個名稱似乎有點多餘,但是當我考慮它時,我想使用「pos」而不是我的着色器代碼中的「POSITION」更舒適一些。 – bitwise

+2

解耦頂點佈局和着色器輸入佈局的原因是,您可能想要使用具有不同着色器且需要不同輸入的相同頂點數據。一個常見的例子是深度預處理或陰影渲染通道,您只需要訪問着色器中的位置。通過在自己的緩衝區中存儲位置,可以避免浪費的內存帶寬在深度着色器中獲取其他頂點組件。當你以後在你的照明/渲染過程中渲染對象時,你可能需要其他頂點組件,如紋理座標,法線等。 – mattnewport

+0

@albundy你可能會發現編譯一個簡單着色器到程序集並查看生成的ASM文件(通過使用/ Fc開關調用fxc.exe)。當你這樣做的時候,編譯器會寫一個很長的註釋部分,並提供關於它如何連接各種緩衝區的有趣信息。然後,您可以開始播放輸入和格式規格以及它們如何互動。 –