2010-07-07 49 views
2

好了,所以假設我有,在我的着色器的地方,如下聲明(注意我使傳統支持共享DX9和DX10之間着色器):D3D10 HLSL:我如何通過反射將紋理綁定到全局Texture2D?

Texture2D DiffuseMap; 

我可以編譯了,沒有任何問題的着色器,但對於如何將ShaderResourceView綁定到「DiffuseMap」,我略有損失。當我「反思」着色器時,我寧願將它變成一個常量緩衝區中的變量。它沒有。事實上,我似乎無法在任何地方找到它。那麼我怎麼知道我應該綁定ShaderResourceView的紋理「舞臺」(使用DX9術語)呢?

編輯:我發現我可以通過使用「GetResourceBindingDesc」來識別採樣器名稱。我不知道,可以幫助我的人,雖然:(

EDIT2:同樣我沒有注意到其在DX9一樣好......我也就是隻能得到採樣

EDIT3:我的Texture2D和取樣是這樣的:

Texture2D DiffuseMap : DiffuseTexture; 
sampler DiffuseSampler = sampler_state 
{ 
    Texture = (DiffuseMap); 
    MinFilter = Linear; 
    MaxFilter = Linear; 
}; 

現在效果框架的工作,我可以通過語義「DiffuseTexture」得到的Texture2D然後我就可以建立一個ResourceView中(D3D10)/紋理(D3D9)到的Texture2D。 。唉,似乎沒有辦法通過使用bog標準着色器來處理「語義」(知道D3D如何做,但研究D3D11效果框架讓我無處可見,因此f AR。它似乎是從二進制文件(即已編譯的數據)中讀出來的,我只能在那裏看到「DiffuseSampler」)。

+0

所以你有一個DX9的.fx文件(或只是.vs/.ps?),並且想要編譯它並使用反射在DX10上下文中運行它? – Stringer 2010-07-07 22:04:48

+0

有效......是的。 – Goz 2010-07-08 06:10:34

+0

嗯,我現在看到你的問題。但是如果你有「DiffuseSampler」,就足以知道你需要綁定到一個給定的槽,一個漫反射紋理的SRV,不是嗎?不知道是否需要使用* SetSamplers將DX10採樣器狀態綁定到同一個插槽。 – Stringer 2010-07-08 11:27:07

回答

1

嗯讓我改說一下。在C++端,你有一堆加載的紋理和相關的SRV。現在,您要設置着色器(來自DX9),並且無需查看着色器的寫入方式,將SRV(漫反射到漫反射槽,鏡面反射,法線貼圖 - 您的名稱)綁定。對?

然後我想,你說,你最好的選擇是使用GetResourceBindingDesc

HRESULT GetResourceBindingDesc(
    [in] UINT ResourceIndex, 
    [in] D3D10_SHADER_INPUT_BIND_DESC *pDesc 
); 

我認爲你必須遍歷每個ResourceIndex(從0開始,然後1,2等),如果HRESULTS_OK然後您有pDesc.BindPoint,它將代表*SetShaderResources調用的ppShaderResourceViews數組中的關聯SRV的位置。和pDesc.Name(如「DiffuseMap」)給你的關聯信息。

+0

GetResourceBindingDesc返回給我的是Sampler而不是Texture2D,但是:(感謝BindPoint部分的確認,但是我猜想的確是這樣,但是不確定,真正好的是如果你可以在用戶 - (如效果文件中) – Goz 2010-07-08 11:05:47

+0

在DX9中的採樣器和紋理是相同的,不是嗎?只有DX10/11在採樣器和紋理(或緩衝區)之間進行了清晰的分離 – Stringer 2010-07-08 11:18:37

+0

它們不一樣在DX9 AFAIK中,如果你願意,你可以將多個採樣器連接到相同的紋理上...我看不到任何你想要的原因,但你可以做到這一點(再次AFAIK) – Goz 2010-07-08 11:40:09