2012-07-26 93 views
5

我可以發送一個紋理着色器:的DirectX 11,發送多個紋理使用此代碼到着色器

devcon->PSSetShaderResources(0, 1, &pTexture); 

當然,我提出的pTexture:D3DX11CreateShaderResourceViewFromFile

着色器: 的Texture2D紋理;

return color * Texture.Sample(ss, texcoord); 

我目前只發送一個紋理到着色器,但我想發送多個紋理,這怎麼可能?

謝謝。

+0

你想要做混合/多紋理? – 2012-07-26 11:45:24

回答

7

通過使用Texture Arrays。當你填寫你的D3D11_TEXTURE2D_DESC看看ArraySize會員。這個desc結構是被傳遞給ID3D11Device::CreateTexture2D的結構。然後在着色器中使用第三個texcoord採樣索引,指示您所指向的數組中的哪個2D紋理。

更新:我才意識到你可能會談論做了多次調用(即針對不同的地理),在這種情況下,你更新着色器的紋理資源視圖。如果您正在使用效果框架,則可以使用ID3DX11EffectShaderResourceVariable::SetResource,或者使用PSSetShaderResources重新綁定新紋理。但是,如果您嘗試在多個紋理之間進行混合,則應該使用紋理數組。

您可能還想查看三維紋理,這些紋理通過texcoord中的第三個元素提供了一種在數組中的相鄰紋理之間進行插值的自然方法(而2D陣列會自動鉗位到最接近的整數)。請參閱HLSL sampleremarks

+0

有趣,虐待嘗試... – 2012-07-26 11:34:37

+0

只有一個問題,我如何選擇,如果我想合併,所以我只想合併在某些情況下?我禁用了第二個texcoord? – 2012-07-26 11:39:15

+0

我不使用效果框架。 – 2012-07-26 11:47:26

14

只要其數量不超過着色器配置文件規格,就可以使用多個紋理。下面是一個例子: HLSL代碼:

Texture2D diffuseTexture : register(t0); 
Texture2D anotherTexture : register(t1); 

C++代碼:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture); 

因此,例如,對於上面的HLSL代碼將是:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV); 
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View) 

OR:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV}; 
devcon->PSSetShaderResources(0, 2, &textures); 

HLSL名稱可以是阿爾比trary並且不必與任何特定名稱相對應 - 只有索引很重要。雖然「註冊(tXX);」聲明不是必需的,我建議您使用它們以避免混淆哪個紋理對應於哪個插槽。

+0

*(SRV代表着色器資源視圖) – d7samurai 2014-04-11 13:28:18