簡體   English   中英

Directx 11,將多個紋理發送到着色器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM