繁体   English   中英

编译DirectX11着色器文件

[英]Compiling DirectX11 Shader Files

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

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

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 ==========

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

我注意到,在编译Shader文件时DirectX 11中与Windows Kit相比与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中是否存在我不知道的某些属性或设置不正确。 我愿意提供任何建议以帮助解决此问题。

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

  • 假设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

错误消息非常明显,编译器无法找到入口点,默认情况下为main 我的猜测是您的着色器使用vsmainpsmain类的东西...

如果查看D3DCompileFromFile的文档,则将看到一个参数是入口点的名称: https : D3DCompileFromFile 。 85).aspx

另外,假设"*s_5_0" or "*s_5_1"是您的伪代码, or是最近的C ++中不推荐使用的功能,此处仅两个指针并给出true,并且compile函数无法识别通配符。

我提出这个问题之后; 我偶然发现了这个问题FXC:错误X3501:'main':找不到入口点,并且从那里有一些评论和答案。 我只是结束了右键单击“ color.psh”和“ color.vsh”文件并在其属性下单击:

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

现在,所有事物都可以成功构建,并且可以按照预期在黑色窗口背景上渲染绿色三角形。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM