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

Mig*_*l P 6 c++ shader textures directx-11

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

 devcon->PSSetShaderResources(0, 1, &pTexture); 
Run Code Online (Sandbox Code Playgroud)

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

着色器:Texture2D纹理;

return color * Texture.Sample(ss, texcoord);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

小智 17

只要计数不超过着色器配置文件规范,就可以使用多个纹理.这是一个例子:HLSL代码:

Texture2D diffuseTexture : register(t0);
Texture2D anotherTexture : register(t1);
Run Code Online (Sandbox Code Playgroud)

C++代码:

devcon->V[P|D|G|C|H]SSetShaderResources(texture_index, 1, &texture);
Run Code Online (Sandbox Code Playgroud)

例如,对于上面的HLSL代码,它将是:

devcon->PSSetShaderResources(0, 1, &diffuseTextureSRV);
devcon->PSSetShaderResources(1, 1, &anotherTextureSRV); (SRV stands for Shader Texture View)
Run Code Online (Sandbox Code Playgroud)

要么:

ID3D11ShaderResourceView * textures[] = { diffuseTextureSRV, anotherTextureSRV};
devcon->PSSetShaderResources(0, 2, &textures);
Run Code Online (Sandbox Code Playgroud)

HLSL名称可以是任意的,不必与任何特定名称相对应 - 只有索引很重要.而"注册(tXX);" 语句不是必需的,我建议你使用它们以避免混淆哪个纹理对应哪个槽.

  • *(SRV代表着色器资源视图) (2认同)

Pre*_*eti 8

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

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

您可能还想查看3D纹理,它提供了一种自然的方式,可以通过texcoord中的第3个元素在数组中的相邻纹理之间进行插值(而2D数组会自动钳位到最接近的整数).请参阅HLSL sample 备注.