Directx 11,向着色器发送多个纹理

9
使用这段代码,我可以将一个纹理发送到着色器中:
 devcon->PSSetShaderResources(0, 1, &pTexture); 

当然,我是通过D3DX11CreateShaderResourceViewFromFile创建pTexture的。

着色器: Texture2D Texture;

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

我目前只向着色器发送了一个纹理,但我想发送多个纹理,这是否可能?

谢谢。


你是在尝试进行混合/多纹理吗? - Preet Kukreti
2个回答

23

只要纹理数量不超过您的着色器配置规格,就可以使用多个纹理。以下是一个示例: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名称可以是任意的,并且不需要对应于任何特定名称 - 只有索引才是重要的。虽然不需要 "register(tXX);" 语句,但我建议您使用它们以避免混淆,以确定哪个纹理对应哪个插槽。


2
(SRV代表着Shader Resource View) - d7samurai
我有一个包含Texture2D和Sampler等其他变量的数组, 但是当我使用devcon->PSSetShaderResources(7, 2, &textures);时, 调试层会要求我使用第8个slot, 如果我使用devcon->PSSetShaderResources(8, 2, &textures);它会要求我使用第7个slot。这应该是什么预期结果? Texture2D imageMixTexture[5] : register(t7); SamplerState imageMixSampler[5] : register(s7); Texture2D uyvyImageTexture : register(t8); SamplerState uyvyImageSampler : register(s8); - Tajuddin Khandaker
“While”语句中的“register(tXX);”并不是必需的,这意味着代码编写时,索引较小? - 上山老人

8

通过使用纹理数组。当填写D3D11_TEXTURE2D_DESC时,请查看ArraySize成员。这个描述结构是传递给ID3D11Device::CreateTexture2D的结构。然后在您的着色器中,您使用第三个纹理坐标采样索引,该索引指示您正在引用哪个数组中的2D纹理。

更新: 我刚意识到你可能在谈论在多个调用中执行此操作(即针对不同的地理位置),这种情况下,您需要更新着色器的纹理资源视图。如果您正在使用效果框架,则可以使用ID3DX11EffectShaderResourceVariable :: SetResource,或者使用PSSetShaderResources重新绑定新纹理。但是,如果您想在多个纹理之间混合,则应该使用纹理数组。
您还可以查看3D纹理,它们提供了一种自然的方式来插值数组中相邻纹理之间的差异(而2D数组会自动夹紧到最近的整数),通过texcoord中的第三个元素。请参阅HLSL sample remarks

只有一个问题,我该如何选择是否要合并,所以我只想在某些情况下进行合并?我禁用第二个纹理坐标? - Miguel P
我喜欢纹理数组的想法!我会尝试一下! - Miguel P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接