编译DirectX11着色器文件

时间:2016-05-14 09:12:05

标签: c++ visual-studio-2015 windows-7-x64 directx-11 build-error

我目前正在第二系列教程中关注www.rastertek.com的DirectX 11教程。我目前在Windows7 x64上使用VS2015。按照本教程,让我使用Windows 10工具包。

我已经成功完成了前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 ==========

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

我注意到的其中一件事情与Windows套件中的DirectX 11不同,而编译着色器文件时,已弃用的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 );

...对战

本教程(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的不同编译器之间发生了什么变化,我不明白这个错误的生成位置和原因。我不知道网站教程中的Shader源代码是否遗漏了某些内容,或者VS2015中是否存在某种属性或设置未设置正确,我不知道。我愿意接受任何有助于解决此问题的建议。

3 个答案:

答案 0 :(得分:3)

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

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

因为Visual Studio会为您编译着色器,所以您不必通过D3DCompileFromFile自行编译它们,考虑使用D3DReadFileToBlob来读取数据,然后将它们传递给{{1}来自CreateVertexShader

如果您不想ID3D11Device编译着色器,可以FXC - 将其更改为Right click on file -> Properties -> General -> Item type

答案 1 :(得分: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,而编译函数不识别通配符

答案 2 :(得分:0)

我提交了这个问题之后;我碰巧偶然发现了这个问题FXC : error X3501: 'main': entrypoint not found以及那里的一些评论和答案。我只是右键点击" color.psh"和" color.vsh"文件及其属性:

  • 配置属性 - >一般 - >从构建部分中排除我将标记设置为"是"
    • HLSL编译器 - >一般 - >着色器类型部分我分别为Pixel&amp ;;设置着色器类型。每个文件的顶点着色器。
    • HLSL编译器 - >一般 - >着色器模型部分我为这两个文件设置了Shader Model 5.0(/ 5_0)。

现在每件事都成功构建,我按照预期在黑色窗口背景上渲染绿色三角形。