c++ - 如何在 HLSL DirectX11 C++ 中使用 Texture2DArray

标签 c++ directx shader hlsl

我只是想知道如何在 HLSL 中使用 Texture2DArray。

我正在尝试实现一个模型加载器,其中模型具有不同数量的纹理。目前,我的 HLSL 使用大小为 2 的 Texture2D(纹理和普通纹理),但由于我的模型具有不同数量的纹理,我希望使用 Texture2DArray 但不知道从哪里开始。我一直试图在互联网上找到示例等,但没有运气:(

我加载了编译为“ID3D11ShaderResourceView*”的纹理,所以我应该创建一个变量 ID3D11ShaderResourceView**,我创建一个指向纹理的点数组,然后将其传递给着色器或什么?

有什么帮助吗?

最佳答案

创建时只需设置D3D11_TEXTURE2D_DESCArraySize字段即可。

一个ShaderResourceView查看整个数组,不需要多个 View 。如果您没有在创建时提供自己的 D3D11_SHADER_RESOURCE_VIEW_DESC(而是传递 nullptr),那么您已经设置好了。

如果您要传递自己的 D3D11_SHADER_RESOURCE_VIEW_DESC,则将 ViewDimension 字段设置为 D3D11_SRV_DIMENSION_TEXTURE2DARRAY,然后填写 的所有 4 个成员 View 描述的 Texture2DArray 字段(MostDetailedMipMipLevelsFirstArraySliceArraySize)。

在 HLSL 中你只需要指定:

Texture2DArray myTexture;

代替

Texture2D myTexture;

并且在采样时,uv 坐标是三维的。 x 和 y 是正常的,但 z 是您要从中读取的数组切片的索引。

如果您在创建时使用 D3D11_SUBRESOURCE_DATA 结构初始化您的纹理,那么您只需传递一个指向 D3D11_SUBRESOURCE_DATA 数组的指针,每个数组一个切片在数组中。

关于c++ - 如何在 HLSL DirectX11 C++ 中使用 Texture2DArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20721760/

相关文章:

java - 我们可以在 JavaFX 中实现我们自己的 Material 吗?

c++ - 如何到达字符串中的第二个单词?

c++ - std::list of move-only 类型:无法在 VC++ 中放入 std::vector

opengl - 使用顶点/像素着色器(Open GL/DirectX)进行通用计算

c++ - DirectXMath vector 运算精度

android - 通过 fragment 着色器将 YUV 转换为 RGB

c# - 如何从 C# 将双指针传递给 COM 并在 COM 中初始化它

c++ - 将具有 OO 语法的 Matlab 转换为 c/c++ 而无需重写其功能

c++ - DirectX11 - 带流输出的几何着色器

c++ - 现代OpenGL阴影立方体贴图上的指针?