有没有办法在没有 Visual Studio 的情况下使用 DirectXTex?
Is there a way to use DirectXTex without Visual Studio?
到目前为止,我尝试使用我的 DirectX 11 项目来加载纹理:
我下载了 DirectXTex 源代码,将源文件包含到我的项目中并尝试编译,但出现错误。我从这些头文件中得到了错误:WICTextureLoader.h
、DDSTextureLoader.h
和 DirectXTex.h
。错误来自头文件,而不是我自己的代码。然后,我尝试了 WICTextureLoader11.h
和 DDSTextureLoader11.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_subdirectory
和 target_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 directory的WICTextureLoader11.h
和WICTextureLoader11.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 建议的所有事情:
- 下载 DirectXTex。
- 将 DirectXTex 子文件夹移动到某处(您稍后会 link 到它);我的位置示例:
I:\Projects\VS\Real_DirectX11\common\include\DirectXTex
- 在您项目的源代码中(在我的例子中,我只有 main.cpp),#include
(不在引号中,因为我要 link它)。
- 从子文件夹 WICTextureLoader 中取出两个文件:
WICTextureLoader11.cpp
和 WICTextureLoader11.h
.
- 并将它们放入我的项目源代码中(或者您可能想要 link 它们)。
- 在我的
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 渲染引擎是否会遇到任何麻烦...但我只希望一切都会好起来。
到目前为止,我尝试使用我的 DirectX 11 项目来加载纹理:
我下载了 DirectXTex 源代码,将源文件包含到我的项目中并尝试编译,但出现错误。我从这些头文件中得到了错误:WICTextureLoader.h
、DDSTextureLoader.h
和 DirectXTex.h
。错误来自头文件,而不是我自己的代码。然后,我尝试了 WICTextureLoader11.h
和 DDSTextureLoader11.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_subdirectory
和 target_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 directory的WICTextureLoader11.h
和WICTextureLoader11.cpp
以获得[=18=的Direct3D 11版本].您收到 link 错误的原因是您没有将 cpp 文件添加到您的项目中。
The DirectX Tool Kit also includes
DDSTextureLoader
,WICTextureLoader
, andScreenGrab
. These versions are integrated in theDirectXTK.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 建议的所有事情:
- 下载 DirectXTex。
- 将 DirectXTex 子文件夹移动到某处(您稍后会 link 到它);我的位置示例:
I:\Projects\VS\Real_DirectX11\common\include\DirectXTex
- 在您项目的源代码中(在我的例子中,我只有 main.cpp),#include
(不在引号中,因为我要 link它)。 - 从子文件夹 WICTextureLoader 中取出两个文件:
WICTextureLoader11.cpp
和WICTextureLoader11.h
. - 并将它们放入我的项目源代码中(或者您可能想要 link 它们)。
- 在我的
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 渲染引擎是否会遇到任何麻烦...但我只希望一切都会好起来。