编译 DirectX11 着色器文件

Compiling DirectX11 Shader Files

我目前正在学习第 2 系列教程中来自 www.rastertek.com 的 DirectX 11 教程。我目前在 Windows7 x64 上使用 VS2015。按照本教程让我使用 Windows 10 套件。

我已成功完成前 3 个教程,并能够使用 DirectX 11 渲染彩色 window。我刚刚完成教程 4,使用带顶点和像素的 HLSL 渲染彩色三角形着色器。我正在学习本教程,其中顶点着色器和像素着色器都在单独的文件中,我的代码中唯一的区别是我使用的文件扩展名。他的网站分别使用 *.vs 和 *.ps,而我使用 *.vsh 和 *.psh,因为这让我可以突出显示代码。我所有的 class 文件都可以正确编译,但是当我开始构建我的解决方案时,我收到了这个错误。

1>------ Build started: Project: DirectX 11 Engine, Configuration: Debug x64 ------
1>FXC : error X3501: 'main': entrypoint not found
1>
1>  compilation failed; no code produced
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

本网站的创建者没有任何联系信息或基于社区的论坛。我不知道这是否是网站教程中的错误。现在我知道这段代码在使用旧版本的 VS(例如 2010、2012 和 2013)之前在 Windows Vista 和 Windows 7 上使用 Windows 7 和 Windows他的第一个 DirectX 10 和 DirectX 11 教程系列中的 8 个套件。我无法从 www.msdn.com 找到任何帮助,因为他们的一些教程是根据 Windows 8 for DirectX 11 使用 VS2013 的要求编写的。他们的文档也很差。

在编译着色器文件时,我注意到 DirectX 11 与 Windows 套件与已弃用的 2010 年 6 月 Direct X SDK 版本的不同之处之一如下:

2010 年 6 月 Direct X SDK - 使用:

HRESULT result;

result = D3DX11CompileFromFile( "shaderFilename", NULL, NULL, "ShaderName", "*s_5_0" or "*s_5_1", D3D10_SHADER_ENABLE_STRICTNESS, 0, NULL, &pShaderBuffer, &pErrorMessage, NULL );

与...

本教程(Windows VS2015 的 10 个工具包) - 用途:

HRESULT result;
result = D3DCompileFromFile( "shaderFilename", NULL, NULL, "ShaderName", "*s_5_0" or "*s_5_1", D3D10_SHADER_ENABLE_STRICTNESS, 0, &pShaderBuffer, &pErrorMessage );

其中着色器文件名、着色器名称、特征级别和着色器缓冲区是顶点或像素着色器类型。在这两种情况下使用的功能级别是“5_0”而不是“5_1”,即使我已经指定了两个功能级别。

我不确定 DirectX 的 HLSL 的不同编译器之间发生了什么变化,而且我不明白从哪里或为什么会生成此错误。我不知道网站教程中的着色器源代码是否遗漏了某些内容,或者是否存在我不知道的某种 属性 或 VS2015 中的设置未正确设置。我愿意接受任何和所有有助于解决此问题的建议。

错误信息很明确,编译器找不到入口点,默认是main。我的猜测是你的着色器使用类似 vsmainpsmain...

如果您查看 D3DCompileFromFile 的文档,您会看到一个参数是入口点的名称:https://msdn.microsoft.com/en-us/library/windows/desktop/hh446872(v=vs.85).aspx

此外,假设 "*s_5_0" or "*s_5_1" 是你的伪代码,or 是最近 C++ 中不推荐使用的功能,这里将只是或两个指针并给出 true,编译函数不会识别通配符。

Visual Studio 使用 FXC 自动为您编译着色器。这里,FXC 报告找不到 main 入口点,即函数 main。这是默认设置,您有 2 个解决方案:

  • 假设 VertexShader 入口点是 ColorVertexShader(它在您链接的教程中),将其更改为 main
  • 更改属性中的入口点:Right click on file -> Properties -> HLSL Compiler -> General -> Entrypoint name

因为Visual Studio为你编译着色器,你不必通过D3DCompileFromFile自己编译它们,考虑使用D3DReadFileToBlob读取数据,然后将它们传递给CreateVertexShader 来自 ID3D11Device.


如果不想FXC编译着色器,可以Right click on file -> Properties -> General -> Item type - 改成Does not participate in build

提交此问题后;我偶然发现了这个问题 FXC : error X3501: 'main': entrypoint not found 以及那里的一些评论和答案。我只是最终右键单击 "color.psh" 和 "color.vsh" 文件并在它们的属性下:

  • Configuration Properties -> General -> Excluded From Build section 我将标志设置为 "Yes"
    • HLSL编译器->常规->着色器类型部分我分别为每个文件的像素和顶点着色器设置了着色器类型。
    • HLSL Compiler -> General -> Shader Model 部分我为两个文件都设置了 Shader Model 5.0(/5_0)。

现在一切都已成功构建,我正在按预期在黑色窗口背景上渲染绿色三角形。