【问题标题】:Load texture in directX 11.1在 directX 11.1 中加载纹理
【发布时间】:2017-12-01 00:31:29
【问题描述】:

我正在阅读 DX11 的 http://www.braynzarsoft.net/ 教程,但我主要学习使用 Metro 风格应用程序在 DX11.1 上编程。 随着我继续学习,我发现 Dx11 中的某些功能在 DX11.1 中不再存在,例如 D3DX11CreateShaderResourceViewFromFile 那个教程用于加载纹理,但在 DX11.1 中我们没有这个! 我的问题是如何在 DX11.1 中加载 DDS 纹理? 我想在此代码中替换该函数,以便我可以加载 DDS 纹理:

hr = D3DX11CreateShaderResourceViewFromFile( d3d11Device, L"braynzar.jpg",
        NULL, NULL, &CubesTexture, NULL );

    // Describe the Sample State
    D3D11_SAMPLER_DESC sampDesc;
    ZeroMemory( &sampDesc, sizeof(sampDesc) );
    sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
    sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
    sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
    sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
    sampDesc.MinLOD = 0;
    sampDesc.MaxLOD = D3D11_FLOAT32_MAX;

    //Create the Sample State
    hr = d3d11Device->CreateSamplerState( &sampDesc, &CubesTexSamplerState );

【问题讨论】:

    标签: c++ directx-11


    【解决方案1】:

    “Direct3D”和“D3DX”之间一直存在区别,但不一定对每个人都很明显。所有版本的 D3DX 现在都是deprecated,不在 Windows 8.x SDK 中,并且不能被 Windows Store 应用程序、Windows phone 8.x 应用程序或 Xbox One 应用程序使用。阅读Where is the DirectX SDK?了解更多信息。

    D3DX 的主要替换库是DirectXTKDirectXTexDirectXMesh。这些支持所有 Direct3D 11.x 平台,包括适用于 Windows 8.0 的 Windows 应用商店应用程序、适用于 Windows 8.1 的 Windows 应用商店应用程序、Windows phone 8.x、Xbox One 和适用于 Windows Vista、Windows 7 和 Windows 8.x 的 Win32 桌面应用程序。

    与许多 D3DX 函数一样,D3DX11CreateShaderResourceViewFromFile 是一个万能工具,这意味着很难知道它何时会是一个非常快的函数还是一个极慢的函数。

    有两个不同的选项可以替换这个函数:DDSTextureLoader 和 WICTextureLoader。这些是 DirectXTK 的一部分,DirectXTex 包中也有“独立”版本。

    • DDSTextureLoader 是一个非常轻量级的 DDS 文件加载器。它非常高效,但不执行运行时转换或调整大小——这意味着如果它真的是具有 24-bpp 格式数据的旧 Direct3D 9 DDS 文件,则无法加载,必须转换为现代格式。它可以通过“剥离”更高级别的 mipchain 来处理 mipmapped DDS 文件的功能级别限制。这是加载完全“熟”的预构建纹理的理想选择。 DirectXTex 是一个用于“烹饪”的库,但 Visual Studio 2012/2013 内容管道也可以生成 DDS 文件。
    • WICTextureLoader 是使用 WIC 的标准图像文件的“轻量级”加载器,它内置了对 BMP、JPG、PNG、TIF 和 GIF 的支持。它只能加载 2D 纹理,并且可以尝试使用 GPU 的自动生成 mipmap(如果支持给定格式)。它可以在运行时调整图像大小以限制功能级别。理想情况下,您会使用在构建时创建的 DDS 文件,但 WICTextureLoader 在您无法将图像文件预先转换为 DDS 的情况下很有用。

    有关详细信息,请参阅 this 博客文章。

    请参阅 Living without D3DX 博客文章,了解 D3DX11 推荐替代品的完整表格。

    请注意,如果您使用的是 Direct3D 10 和 D3DX10,建议迁移到 Direct3D 11。

    【讨论】:

    • 图片真的有必要吗?
    • 很好。堆栈溢出没有幽默感。明白了。
    • 它几乎占据了您回答的屏幕空间的 50%。没有人会抱怨一句笑话,但我认为一张这么大的图片应该是一个插图,可以从本质上提高你对答案的理解。
    • 我认为这张图片正确地传达了 D3DX 的本质以及它被弃用的原因。无论如何,看起来 SO 的标记语言不允许您调整图像参考的大小......顺便说一句,对于那些问“什么图像?”的人来说。它是this 一个。
    【解决方案2】:

    看看DirectxTK中的DDSTextureLoader。

    edit 他明确询问如何加载 DDS 纹理。请在投反对票之前仔细阅读问题。

    【讨论】:

    • 既然是.JPG,他应该在DirectXTK 中使用WICTextureLoader,但是是的……那是个好去处。一定要看Living without D3DX
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多