語義的目的是什麼?D3D11中語義和頂點佈局的意義是什麼?
,如果我有一個頂點佈局是這樣的:
struct VS_Input
{
float4 position : COLOR;
float4 color : POSITION;
};
請問它實際上事情,我改變了對兩個成員的語義?
如果我必須發送一個Direct3D每個頂點的結構,爲什麼不能按原樣複製我的數據?
如果我爲direct3D提供了一個佈局與着色器不匹配的頂點,會發生什麼?例如,如果我將以下頂點傳遞給上述着色器?
struct MyVertex
{
Vec4 pos;
Vec2 tex;
Vec4 col;
};
在D3D文檔,它表示一個警告將進行生產,我的數據將被「重新詮釋」
這是否意味着「重新詮釋」爲reinterpret_cast的<>?像我的着色器會嘗試使用紋理座標和一半顏色作爲着色器中的顏色?或者是否會搜索我的頂點佈局以查找與每個語義匹配的元素,然後將輸入拖動到正確的位置以使着色器正常工作?
如果上述不符,那麼爲什麼D3D需要明確的頂點佈局?
謝謝。我假定頂點佈局和着色器結構必須對應1到1.另外,你必須爲變量和語義提供一個名稱似乎有點多餘,但是當我考慮它時,我想使用「pos」而不是我的着色器代碼中的「POSITION」更舒適一些。 – bitwise
解耦頂點佈局和着色器輸入佈局的原因是,您可能想要使用具有不同着色器且需要不同輸入的相同頂點數據。一個常見的例子是深度預處理或陰影渲染通道,您只需要訪問着色器中的位置。通過在自己的緩衝區中存儲位置,可以避免浪費的內存帶寬在深度着色器中獲取其他頂點組件。當你以後在你的照明/渲染過程中渲染對象時,你可能需要其他頂點組件,如紋理座標,法線等。 – mattnewport
@albundy你可能會發現編譯一個簡單着色器到程序集並查看生成的ASM文件(通過使用/ Fc開關調用fxc.exe)。當你這樣做的時候,編譯器會寫一個很長的註釋部分,並提供關於它如何連接各種緩衝區的有趣信息。然後,您可以開始播放輸入和格式規格以及它們如何互動。 –