使用此代码,我可以将一个纹理发送到着色器:
devcon->PSSetShaderResources(0, 1, &pTexture);
当然,我通过以下方式制作了 pTexture:D3DX11CreateShaderResourceViewFromFile
着色器:Texture2D 纹理;
return color * Texture.Sample(ss, texcoord);
我目前只向着色器发送一个纹理,但我想发送多个纹理,这怎么可能?
谢谢你。
使用此代码,我可以将一个纹理发送到着色器:
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 数组会自动钳制到最接近的整数)。请参阅 HLSLsample
备注。