2012-07-16 32 views
3

我有點難以理解,只是把我困在一邊。比方說,我有一對夫婦的着色器都具有不同的頂點類型是這樣的:direct x 11智能地創建頂點緩衝區

// light shader 
struct vertexInputType 
{ 
    float4 position : POSITION; 
    float2 tex : TEXCOORD0; 
    float3 normal : NORMAL; 
}; 

// color shader 
struct vertexInputType 
{ 
    float4 position : POSITION; 
    float4 color : COLOR; 
}; 

// bump mapping shader 
struct vertexInputType 
{ 
    float4 position : POSITION; 
    float2 tex : TEXCOORD0; 
    float3 normal : NORMAL; 
    float3 binormal : BINORMAL; 
    float3 tangent : TANGENT; 
}; 

現在比方說,我有所有可用此數據的模型。我無法確切地將它全部放在同一個緩衝區中,並且按照我選擇的全部3進行渲染,因爲數據未針對所有這些數據進行正確佈局。我只看到兩種選擇來實現這一點,他們兩人都同樣痛苦。

1)我可以在RAM中有一個很大的緩衝區來保存所有的數據,然後每次繪製調用時,我從着色器對象,頂點類型中獲取並用正確的信息創建一個新的頂點緩衝區。正如你所看到的,這會很慢。

或...

2)當模型被初始化我可以創建多個ID3D11Buffers,其中一個緩衝器具有的位置和顏色,一個有位置,texcoord,和正常的,一個具有位置,texcoord,正常,binormal和tangent,以及該模型具有信息的任何其他頂點類型所需的緩衝區數量。相比之下,刪除你的可用vram,使其成爲nogo。

我看不到任何其他方式做到這一點。你其他的d3d傢伙如何做到這一點?

回答

2

這是一件好事,你在DX11環境中提出這個問題 - ID3D11InputLayout簡化了這個概念從以前的版本很多。您可以使用CreateInputLayout爲您的頂點數據(上面提供的每個結構都創建一個頂點數據)創建多個佈局,並在想要以不同方式解釋同一個頂點緩衝區的點處使用正確佈局調用IASetInputLayout

編輯:查看here瞭解創建Input-Layout對象的示例。

希望這會有所幫助!

+0

是的,到目前爲止,我在爲着色器創建輸入佈局時使用了教程,但現在我很好奇輸入佈局是如何設置的。你是說我可以擁有一個ID3D11Buffer,它包含位置,顏色,法線,紋理等所有數據,然後可以設置佈局來挑選這個着色器的單個元素?我將如何做到這一點?現在我只是定義了第一個輸入desc元素,它的字節對齊成員爲0,其餘的爲D3D11_INPUT_PER_VERTEX_DATA; 。這樣做背後的方法是什麼我想要的? – FatalCatharsis 2012-07-16 16:28:20

+0

表示其餘的設置爲D3D11_APPEND_ALIGNED_ELEMENT。複製粘貼在它下面的一個:P – FatalCatharsis 2012-07-16 16:33:58

+0

哇,現在,我知道它與輸入佈局有關,我只是設法谷歌下[這](http://msdn.microsoft.com/en-us/library /windows/desktop/bb205117(v=vs.85).aspx#Create_the_Input_Layout)文章。有點解釋我需要知道的一切:\。感謝您讓我走上正軌! – FatalCatharsis 2012-07-16 16:51:13

0

訣竅是將數據分成流:P,T,A

物流P中包含位置和正常的。這些數據需要用光照渲染頂點。你也可以包含binormals和頂點顏色數據。

流T包含紋理信息,因此可以是最多8個TU通道。應注意存儲此流中有多少個通道編碼,以確保不會浪費存儲器帶寬,從而在GPU總線上複製空閒通道。

A組包含動畫信息,骨骼權重等

您可以有更多或更少的通道取決於你的渲染管線架構。這裏的訣竅是使用FVF來動態定義數據佈局。這種架構的一個優點是最佳的內存帶寬使用率。當需要多個渲染通道時,這是特別相關的,但並不是每個通道都需要所有的數據。

+0

恩,FVF和流是d3d9我認爲。真的不知道你在說什麼:\ – FatalCatharsis 2012-07-16 16:30:51