编译DirectX11着色器文件
Compiling DirectX11 Shader Files
我目前正在学习第二系列教程中来自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中是否有我不知道的某种属性或设置没有正确设置。我愿意接受任何有助于解决这个问题的建议。
FXC
自动编译着色器。这里,FXC
报告它找不到main
入口点,即函数main
。这是默认的,你有两个解决方案:
- 假设VertexShader入口点是
ColorVertexShader
(它在您链接的教程中),将其更改为main
- 更改属性中的入口点:
Right click on file -> Properties -> HLSL Compiler -> General -> Entrypoint name
因为Visual Studio为您编译着色器,所以您不必自己通过D3DCompileFromFile
编译它们,请考虑使用D3DReadFileToBlob
读取数据,然后从ID3D11Device
在CreateVertexShader
中传递它们。
如果不希望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
。我的猜测是,您的着色器使用类似vsmain
或psmain
的东西。。。
如果您查看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,并且编译函数不识别通配符。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 效果11d.lib文件,DirectX11在2017/2015上
- DirectX11 DirectXTK需要一个CSO文件进行测试
- DirectX11 如何加载 Obj 文件
- 编译DirectX11着色器文件