有没有办法在没有 Visual Studio 的情况下使用 DirectXTex?

Is there a way to use DirectXTex without Visual Studio?

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

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

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

可以使用 clang/LLVM for Windows 或 Visual C++ 构建 DirectXTex 库。该项目包括用于构建 DirectXTex 库的 CMakeLists.txt,以及可选的 command-line 工具,使用 CMake。如果您有自己的 make 解决方案,您可以通过参考该文件来制定详细信息。

要使用DirectXTex库函数(a.k.a.LoadWICFromFile,Compress等),需要link到DirectXTex库,可以通过 add_subdirectorytarget_link_libraries 在 CMake 中执行。您还需要添加包含路径:

要在您自己的 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 如果你想要基本的运行时加载而不需要转换、调整大小、压缩等所需的所有代码

要使用 stand-alone 模块,您需要将 header 和 .cpp 文件添加到您的项目中——它们是 在DirectXTex.lib.

所以在你的情况下,包括来自this directoryWICTextureLoader11.hWICTextureLoader11.cpp以获得[=18=的Direct3D 11版本].您收到 link 错误的原因是您没有将 cpp 文件添加到您的项目中。

The DirectX Tool Kit also includes DDSTextureLoader, WICTextureLoader, and ScreenGrab. These versions are integrated in the DirectXTK.lib. Instead of using DirectXTex at all, you could use that project's CMakeLists.txt and reference it as:

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 documentation and this blog post

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

最初的问题是我想使用 GCC 以便与 DirectX 11 一起工作,但是当我需要加载纹理时,不幸的是 D3DX (d3dx11.h ) 我想使用的函数已被弃用,取而代之的是 D3D 实现:我应该考虑使用具有我需要的函数 (CreateWICTextureFromFile) 的 DirectXTex 而不是使用 D3DX11CreateShaderResourceViewFromFile

好吧,我下载并做了(有点)Chuck Walbourn 建议的所有事情:

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

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

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

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

包括

C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.27.29110\include

lib

C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.27.29110\lib\x64

lib32

C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.27.29110\lib\x86

并且,为了以防万一,还包括 bin

C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.27.29110\bin\Hostx64\x64

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

build.bat

@echo off

set filename=%1

clang++ ^
%cd%\src\%1.cpp ^
-I"C:\Program Files (x86)\Windows Kits\Include.0.18362.0\ucrt" ^
-I"C:\Program Files (x86)\Windows Kits\Include.0.18362.0\um" ^
-I"C:\Program Files (x86)\Windows Kits\Include.0.18362.0\winrt" ^
-I"C:\Program Files (x86)\Windows Kits\Include.0.18362.0\shared" ^
-I"I:\Projects\VS\Real_DirectX11\common\include\DirectXTex" ^
-L"C:\Program Files (x86)\Windows Kits\Lib.0.18362.0\ucrt\x64" ^
-L"C:\Program Files (x86)\Windows Kits\Lib.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 渲染引擎是否会遇到任何麻烦...但我只希望一切都会好起来。