2016-05-14 219 views
0

我目前在第二系列教程中关注www.rastertek.com中的DirectX 11教程。我目前在Windows7 x64上使用VS2015。以下教程让我​​使用Windows 10套件。编译DirectX11着色器文件

我已经成功完成了前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 Vista和Windows 7上使用较旧版本的VS(例如2010,2012和2013)之前已经工作,使用Windows 7 &他的第一个系列的DirectX 10 & DirectX 11教程中的Windows 8套件。我无法从www.msdn.com找到任何帮助,因为他们的某些教程是使用VS2013针对DirectX 11的Windows 8要求编写的。他们的文档也很差。

其中之一,我已经注意到了,东西是从Windows工具包与不推荐使用的2010年6月的Direct X SDK版本中的DirectX 11不同的,当编译一个Shader文件如下:

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 Source代码是否缺少某些东西,或者如果VS2015中有某种属性或设置未正确设置,我不知道。我乐意提供任何和所有建议来帮助解决此问题。

回答

0

我已经提交了这个问题后,我碰巧遇到了这个问题FXC : error X3501: 'main': entrypoint not found以及那里的一些评论和答案。我只是结束了右侧点击“color.psh”和“color.vsh”文件,并根据它们的属性:

  • 配置属性 - >常规 - >排除从Build部分我设置了标志为“是”
    • HLSL编译器 - >常规 - >着色器类型部分我分别为像素设置着色器类型&每个文件的顶点着色器。
    • HLSL编译器 - >常规 - >着色器模型部分我将这两个文件设置为着色器模型5.0(/ 5_0)。现在

每一件事情成功构建和我在一个黑色背景窗呈现绿三角预期。

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,而编译函数不能识别通配符。

+0

不,野生甜菜只不过是代表“v”或“p”的问题中的占位符。我正在调用这个过程两次,每次着色器一次。 –

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读取数据,然后将它们在CreateVertexShaderID3D11Device


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

+0

这听起来很有趣,但是,我试图在其实现中保持接近该网站的教程,我将跳入他们网站上的系列2部分的地形教程。 –

+1

@FrancisCugler在这种情况下,你可以在属性文件中排除构建 – galop1n

+0

@ galop1n是的,谢谢你,尽管你的评论有点晚了。我弄明白了。我一直在寻找几个小时来找到解决这个问题的方法,所以我在这里问了一些问题,当我在等待一个答案或评论时,我偶然发现了另一个带有工作解决方案的线程。坏时机的可能性! –