编译DirectX11着色器文件

Compiling DirectX11 Shader Files

本文关键字:文件 DirectX11 编译      更新时间:2023-10-16

我目前正在学习第二系列教程中来自www.rastertek.com的DirectX 11教程。我目前正在Windows7 x64上使用VS2015。下面的教程让我使用Windows10工具包。

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

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&Windows8套件来自他的第一个DirectX 10&DirectX 11教程。我没能从www.msdn.com上找到任何帮助,因为他们的一些教程是根据Windows 8对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 );

Versus。。。

本教程(VS2015的Windows 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中是否有我不知道的某种属性或设置没有正确设置。我愿意接受任何有助于解决这个问题的建议。

Visual Studio使用FXC自动编译着色器。这里,FXC报告它找不到main入口点,即函数main。这是默认的,你有两个解决方案:
  • 假设VertexShader入口点是ColorVertexShader(它在您链接的教程中),将其更改为main
  • 更改属性中的入口点:Right click on file -> Properties -> HLSL Compiler -> General -> Entrypoint name

因为Visual Studio为您编译着色器,所以您不必自己通过D3DCompileFromFile编译它们,请考虑使用D3DReadFileToBlob读取数据,然后从ID3D11DeviceCreateVertexShader中传递它们。


如果不希望FXC编译着色器,可以Right click on file -> Properties -> General -> Item type-将其更改为Does not participate in build

在我提交了这个问题之后;我偶然发现了这个问题FXC:错误X3501:"main":找不到入口点,以及那里的一些评论和答案。我只是右键点击了"color.psh"answers"color.vsh"文件,并在它们的属性下:

  • Configuration Properties(配置属性)->General(常规)->Excluded From Build(从构建中排除)部分I将标志设置为"Yes"(是)
    • HLSL编译器->常规->着色器类型部分我分别为Pixel&每个文件的顶点着色器
    • HLSL编译器->常规->着色器模型部分我为这两个文件设置了着色器模型5.0(/5_0)

现在,每件事都成功构建了,我正在按预期在黑色窗口背景上绘制一个绿色三角形。

错误消息非常明确,编译器无法找到入口点,默认情况下为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,并且编译函数不识别通配符。