【问题标题】:Directx 11, send multiple textures to shaderDirectx 11,将多个纹理发送到着色器
【发布时间】:2023-03-07 00:11:01
【问题描述】:

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

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

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

着色器: Texture2D 纹理;

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

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

谢谢。

【问题讨论】:

  • 您是否尝试进行混合/多重纹理处理?

标签: c++ shader textures directx-11


【解决方案1】:

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

【讨论】:

  • *(SRV 代表着色器资源视图)
  • 我有一个纹理 2D 数组和采样器以及其他数组,但是当我使用 devcon->PSSetShaderResources(7, 2, &textures);当我使用 devcon->PSSetShaderResources(8, 2, &textures); 时,调试层要求插槽 8;它要求插槽 7。应该期待什么? Texture2D imageMixTexture[5] : register(t7); SamplerState imageMixSampler[5] : register(s7); Texture2D uyvyImageTexture : register(t8); SamplerState uyvyImageSampler : register(s8);
  • '而“注册(tXX);” statements are not required'的意思是代码先写,索引少?
【解决方案2】:

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

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

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

【讨论】:

  • 只有一个问题,我要如何选择是否要合并,所以我只想在某些情况下合并?我禁用了第二个 texcoord?
  • 我喜欢纹理数组的想法!我试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多