错误C2146试图在C ++中编译基本的HLSL着色器

时间:2013-02-02 17:37:19

标签: c++ hlsl

我刚刚开始使用C ++学习HLSL的基础知识,我按照书上的教程,第一个基本着色器是:

float4 VS_Main( float4 pos:POSITION):SV_POSITION
{

return pos;
}

但是我在编译时遇到了很多错误:

错误C2146:语法错误:';'在标识符'VS_Main'

之前丢失

错误C4430:缺少类型说明符,假设为int。注意:不再支持default-int

错误C2146:语法错误:')'在标识符'pos'

之前丢失

错误C2059:语法错误看起来像函数定义,但没有正式的参数列表。

错误C2059:语法错误:'{'

它真的看起来编译器根本无法处理HLSL ...也许VS2012 express不支持HLSL?

提前致谢

3 个答案:

答案 0 :(得分:1)

HLSL不是C ++。您应该使用着色器编译器编译着色器,使用C ++编译器编译C ++ - 不要混用。编译HLSL有两种选择。

  1. 使用DirectX SDK中包含的命令行实用程序fxc.exe(文档和用法here at MSDN)。它会生成一个文件,您应该通过here
  2. 描述的一些方法在运行时加载该文件
  3. 使用D3DCompileFromFile函数在运行时编译着色器。
  4. 每种变体都有利弊。简而言之,在构建时进行预编译可以在运行时获得一些时间,而在运行时编译在开发阶段更灵活,更舒适(无需记住重新编译或使用构建后脚本)但更多错误 - 易于。自己选择。

答案 1 :(得分:1)

代码看起来很适合HLSL。如果要从VS2012中编译它,请使用HLSL着色器编译器将“.fx”文件设置为构建。右键单击文件选择属性。然后选择General和Item Type应设置为HLSL编译器。

如果您真的想使用C ++制作着色器,可以查看C ++ AMP,看它是否适合您的需求。

答案 2 :(得分:0)

  

它真的看起来编译器根本无法处理HLSL ...也许VS2012 express不支持HLSL?

没有C ++编译器。它不应该由编译器处理。

您需要将其转换为资源并使用构建后脚本将其复制到bin目录中,并在运行时加载HLSL。

另请参阅:http://www.directxtutorial.com/Lesson.aspx?lessonid=11-4-5