[英]Directx 11, send multiple textures to shader
使用此代碼我可以將一個紋理發送到着色器:
devcon->PSSetShaderResources(0, 1, &pTexture);
當然我通過以下方式制作了pTexture:D3DX11CreateShaderResourceViewFromFile
着色器:Texture2D紋理;
return color * Texture.Sample(ss, texcoord);
我目前只向着色器發送一個紋理,但我想發送多個紋理,這怎么可能?
謝謝。
只要計數不超過着色器配置文件規范,就可以使用多個紋理。 這是一個例子: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)
要么:
ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV};
devcon->PSSetShaderResources(0, 2, &textures);
HLSL名稱可以是任意的,不必與任何特定名稱相對應 - 只有索引很重要。 而“注冊(tXX);” 語句不是必需的,我建議你使用它們以避免混淆哪個紋理對應哪個槽。
通過使用紋理陣列 。 當您填寫D3D11_TEXTURE2D_DESC
查看ArraySize
成員。 這個desc結構是傳遞給ID3D11Device::CreateTexture2D
。 然后在着色器中使用第三個texcoord采樣索引,該索引指示您所引用的數組中的哪個2D紋理。
更新:我剛剛意識到你可能正在談論通過多個調用(即不同的地理位置)進行此操作,在這種情況下,您將更新着色器的紋理資源視圖。 如果您正在使用效果框架,則可以使用ID3DX11EffectShaderResourceVariable :: SetResource ,或者使用PSSetShaderResources
重新綁定新紋理。 但是,如果您嘗試在多個紋理之間進行混合,則應使用紋理數組。
您可能還想查看3D紋理,它提供了一種自然的方式,可以通過texcoord中的第3個元素在數組中的相鄰紋理之間進行插值(而2D數組會自動鉗位到最接近的整數)。 請參閱HLSL sample
備注 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.