【问题标题】:Is there a way to use DirectXTex without Visual Studio?有没有办法在没有 Visual Studio 的情况下使用 DirectXTex?
【发布时间】:2020-08-09 13:18:57
【问题描述】:

到目前为止,我尝试使用我的 DirectX 11 项目来加载纹理:

我下载了 DirectXTex 源,将源文件包含到我的项目中并尝试编译,但出现错误。我从这些头文件中得到错误:WICTextureLoader.hDDSTextureLoader.hDirectXTex.h。错误来自头文件,而不是我自己的代码。然后,我尝试了WICTextureLoader11.hDDSTextureLoader11.h,我得到的错误是undefined reference to the function CreateWICTextureFromFile()...(或相同,但使用DDS)。

我认为,这里的问题可能是编译器(我使用 Clang/GCC)找不到.lib 文件?但是,这里有些人提到您可以将源文件放入您的文件夹中,一切都会好起来的。好像,对我来说不太行。如果这是问题所在,有没有办法在不通过 VS 安装和其他东西的情况下获取二进制文件 (.lib)?

【问题讨论】:

  • 使用 C++ 编译的二进制文件与不同的编译器或在某些情况下使用同一编译器的不同版本通常是不安全的(比 2015 年旧的 Visual Studio 版本都是二进制不兼容的)。但是,如果这是一个 Windows OS api,它可能是 c
  • 现在我查看源代码https://github.com/microsoft/DirectXTex 这是一个具有完整源代码的c++ 项目。您应该使用 CMake 生成 MinGW makefiles 项目并使用 MinGW 构建该项目
  • @drescherjm 感谢您的提示。所以我尝试下载 Cmake 并做了下一个:我使用 Cmake GUI 并选择生成 MinGW Makefile。但是由于我对这两个都不熟悉,所以我不知道下一步该做什么。我有一个包含 Makefile 的文件夹,我试图运行它,但出现了很多错误。所以我不确定我应该怎么做。
  • 我有一个包含 Makefile 的文件夹,我试图运行它,但出现了很多错误。 很可能微软没有使这个库与其他编译器。我的建议是使用 Visual Studio 2019,避免将代码移植到其他编译器的痛苦。
  • @drescherjm DirectXTex 的 github 页面声明“此代码旨在使用 ... clang 构建”。我不明白的另一件事是,正如 Chuck Walbourn 本人在这里回答的那样,您可以将两个 header/cpp 文件都放入项目中,一切都应该没问题。我会尝试用 cmake/makefile 再次做一些事情,直到我得到答案,如果我最终再次安装 VS(我真的不喜欢)会很伤心。

标签: c++ directx directx-11


【解决方案1】:

DirectXTex 库可以使用 clang/LLVM for Windows 或 Visual C++ 构建。该项目包括一个CMakeLists.txt,用于使用 CMake 构建 DirectXTex 库,以及可选的命令行工具。如果您有自己的 make 解决方案,则可以通过引用该文件来计算详细信息。

要使用 DirectXTex 库函数(又名 LoadWICFromFileCompress 等),您需要链接到 DirectXTex 库,您可以在 CMake 中通过 add_subdirectorytarget_link_libraries 执行此操作。您还需要添加包含路径:

要从您自己的 CMake 中使用它:

add_subdirectory(${CMAKE_SOURCE_DIR}/../DirectXTex ${CMAKE_BINARY_DIR}/bin/CMake/DirectXTex)

target_link_libraries(${PROJECT_NAME} DirectXTex)
target_include_directories(${PROJECT_NAME} PRIVATE ../DirectXTex/DirectXTex)

请记住,DirectXTex 包包括独立模块(DDSTextureLoader、WICTextureLoader 和 ScreenGrab),如果您想要基本运行时加载,则这些模块代替 DirectXTex无需转换、调整大小、压缩等所需的所有代码。

要使用独立模块,您需要将 both 标头和 .cpp 文件添加到您的项目中——它们在 DirectXTex.lib 中不是

所以在你的情况下,从this directory 中包含WICTextureLoader11.hWICTextureLoader11.cpp 以获得CreateWICTextureFromFile 的Direct3D 11 版本。出现链接错误的原因是您没有将 cpp 文件添加到项目中。

DirectX Tool Kit 还包括DDSTextureLoaderWICTextureLoaderScreenGrab。这些版本都集成在DirectXTK.lib 中。完全不用 DirectXTex,您可以使用该项目的 CMakeLists.txt 并将其引用为:

add_subdirectory(${CMAKE_SOURCE_DIR}/../DirectXT ${CMAKE_BINARY_DIR}/bin/CMake/DirectXTK)

target_link_libraries(${PROJECT_NAME} DirectXTK)
target_include_directories(${PROJECT_NAME} PRIVATE ../DirectXTK/Inc)

请参阅WICTextureLoader 文档和this blog post

【讨论】:

  • 感谢您的详细解答。当我将 .h.cpp 文件都包含到我的项目中时,我仍然会收到错误:WIC 出现更多错误(例如 "use of undeclared identifier 'GUID_WICPixelFormat128bppRGBAFloat' ; 你的意思是 'GUID_WICPixelFormat128bppRGBFloat'") 和更少的 DDS(例如“使用未声明的标识符 'FileStandardInfo'”)。编辑:另外,我没有使用 MSVC。
  • 澄清一下,错误不是来自我的项目代码,而是来自 WICTextureLoader11.cpp
  • 您的项目需要与提供所需 GUID dxguid.libuuid.lib 的系统库链接。我也有用于各种 Visual Studio 简单 DirectX 项目模板的 CMake 文件。见CMakeLists.txt
  • 也许我得到的错误与链接过程无关,但我不确定,因为我没有看到列表的末尾 (fatal error: too many errors emitted, stopping now)。无论如何,我包含了您的 CMakeList.txt 示例中列出的库,但我仍然遇到相同的致命错误。我不使用 Cmake 来构建我的项目(我正在使用一个简单的批处理文件),所以我不确定我是否遗漏了什么。
【解决方案2】:

所以,我通过放弃并安装 Visual Studio 解决了这个问题。但是,我最终使用 Clang 编译;但是,我没有链接到 GCC,而是链接到 MSVC(否则,我会收到引用 vcruntime.h 的错误)。

最初的问题是我想使用 GCC 来使用 DirectX 11,但是当我需要加载纹理时,不幸的是我使用的 D3DX (d3dx11.h) 函数不推荐使用想要使用的 D3D 实现:而不是使用 D3DX11CreateShaderResourceViewFromFile,我应该考虑使用具有我需要的功能的 DirectXTex (CreateWICTextureFromFile)。

嗯,我下载并做了(有点)Chuck Walbourn 建议的一切:

  1. 下载 DirectXTex。
  2. DirectXTex 子文件夹移动到某处(稍后您将链接到它);我的位置示例:I:\Projects\VS\Real_DirectX11\common\include\DirectXTex
  3. 在您项目的源代码中(在我的例子中,我只有 main.cpp),#include (不在引号中,因为我要链接到它)。
  4. 从子文件夹 WICTextureLoader 中获取两个文件:WICTextureLoader11.cppWICTextureLoader11.h
  5. 并将它们放入我项目的源代码中(或者您可能想要链接它们)。
  6. 在我的 main.cpp 中,我#include 这两个文件 (.h/.cpp):

没有任何效果,我收到链接错误(很多错误!)。我决定放弃并再次安装 Visual Studio(我再说一遍,因为有一次我进入 OpenGL 并开始更喜欢便携式解决方案;而且非常简单,因为我的项目文件夹只有源代码和资产文件)。

看起来,VS 的加载速度越来越快(不是编译!),所以也许它毕竟不是那么糟糕。没有。我通过 NuGet 包管理器下载了 DirectXTex,并且可能已经为它的工作做了一切。好吧,它有点工作,只是这次我得到了不相关的错误,而我在使用 GCC 编译时没有得到:我的着色器无法编译!哦不,我在哪里搞砸了?我不知道!为每个文件设置首选项(VS、目标版本等),没有任何帮助。

好的,让我们回到我的编译器,除了这次我使用的是 Clang (LLVM 10.0 Windows 64-bit) 并且我链接到 MSVC(安装 Visual Studio 后就拥有它)。如何?我将环境变量 PATH 从 GCC 更改为 MSVC:

包括

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64

lib32

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x86

而且,以防万一,还包括 bin

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx64\x64

然后,我使用批处理文件来编译我的东西:

build.bat

@echo off

set filename=%1

clang++ ^
%cd%\src\%1.cpp ^
-I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt" ^
-I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um" ^
-I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt" ^
-I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared" ^
-I"I:\Projects\VS\Real_DirectX11\common\include\DirectXTex" ^
-L"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64" ^
-L"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64" ^
-L"I:\Projects\VS\Real_DirectX11\common\lib" ^
-w -lkernel32 -luser32 -lole32 -ldxguid -luuid -ldxgi -ld3d11 -ld3dcompiler -ldirectxtex -o %cd%\bin\%1.exe

在命令行中(假设您位于项目的根目录中),我只需编写build main 并回车即可。一切都编译得很好。我正在使用标志 -w 来抑制所有警告。为什么?因为如果我不使用它,它会给出数百个与 Windows SDK 文件相关的警告(不过,我仍然会检查我自己的代码是否没有警告)。

我用这段代码加载了纹理:

HRESULT result;
...
result = DirectX::CreateWICTextureFromFile(d3d11_device, L"../textures/mdx.png", NULL, &texture);
if(FAILED(result))
{
    // handle the error
}

我不知道以后在我的 DirectX 11 渲染引擎中是否会遇到任何麻烦...但我只希望一切都会好起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多