8

使用此代码,我可以将一个纹理发送到着色器:

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

当然,我通过以下方式制作了 pTexture:D3DX11CreateShaderResourceViewFromFile

着色器:Texture2D 纹理;

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

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

谢谢你。

4

2 回答 2

21

您可以使用多个纹理,只要它们的数量不超过您的着色器配置文件规范。这是一个示例: 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);” 声明不是必需的,我建议您使用它们以避免混淆哪个纹理对应于哪个插槽。

于 2012-07-26T17:08:26.950 回答
8

通过使用纹理数组。当您填写您D3D11_TEXTURE2D_DESCArraySize会员时。这个 desc 结构是传递给ID3D11Device::CreateTexture2D. 然后在您的着色器中,您使用第三个 texcoord 采样索引,该索引指示您所指的数组中的哪个 2D 纹理。

更新:我刚刚意识到您可能正在谈论通过多次调用(即针对不同的地理位置)进行此操作,在这种情况下,您将更新着色器的纹理资源视图。如果您正在使用效果框架,您可以使用ID3DX11EffectShaderResourceVariable::SetResource,或者使用PSSetShaderResources. 但是,如果您尝试在多个纹理之间进行混合,那么您应该使用纹理数组。

您可能还想研究 3D 纹理,它提供了一种通过 texcoord 中的第 3 个元素在数组中相邻纹理之间插值的自然方法(而 2D 数组会自动钳制到最接近的整数)。请参阅 HLSLsample 备注

于 2012-07-26T11:27:52.170 回答