将纹理数组发送到 DirectX 11 中的着色器
Sending texture array to shader in DirectX 11
我想在我的 HLSL 着色器中设置为数组的纹理很少。
每个纹理都表示为 ID3D11ShaderResourceView*。
每个纹理的大小可能不同。
现在,如果我在 D3D 中将它们设置为数组:
ID3D11ShaderResourceView* m_array[3];
m_array[0] = ...;
m_array[1] = ...;
m_array[2] = ...;
m_deviceContext->PSSetShaderResources(
0, // Start slot
3, // Nb of textures
m_array); // Array
在我的 HLSL 着色器中我声明:
Texture2D g_textures[3];
会映射正确吗?
这通常是一种可用于将纹理数组从运行时映射到着色器执行的方法。数组中的纹理尺寸匹配并不重要,但是,您可能需要在着色器代码中考虑这一点,具体取决于您对纹理进行采样的方式。
此外,在您的 HLSL 中,您假设 g_textures
数组分配给了插槽 0,因此如果由于某种原因它实际上并没有到达那里(例如,有另一个纹理资源在着色器源代码中位于它之前),那么您就不会将预期的资源设置到正确的插槽中。我发现最好明确地映射它们,例如:
Texture2D g_textures[3] : register(t0);
如果有碰撞,会在(着色器)编译时发现。
我想在我的 HLSL 着色器中设置为数组的纹理很少。 每个纹理都表示为 ID3D11ShaderResourceView*。 每个纹理的大小可能不同。
现在,如果我在 D3D 中将它们设置为数组:
ID3D11ShaderResourceView* m_array[3];
m_array[0] = ...;
m_array[1] = ...;
m_array[2] = ...;
m_deviceContext->PSSetShaderResources(
0, // Start slot
3, // Nb of textures
m_array); // Array
在我的 HLSL 着色器中我声明:
Texture2D g_textures[3];
会映射正确吗?
这通常是一种可用于将纹理数组从运行时映射到着色器执行的方法。数组中的纹理尺寸匹配并不重要,但是,您可能需要在着色器代码中考虑这一点,具体取决于您对纹理进行采样的方式。
此外,在您的 HLSL 中,您假设 g_textures
数组分配给了插槽 0,因此如果由于某种原因它实际上并没有到达那里(例如,有另一个纹理资源在着色器源代码中位于它之前),那么您就不会将预期的资源设置到正确的插槽中。我发现最好明确地映射它们,例如:
Texture2D g_textures[3] : register(t0);
如果有碰撞,会在(着色器)编译时发现。