HLSL错误及如何执行龙书中的代码



error X3025: global variables are implicitly constant, enable compatibility mode to allow modification 
全局变量是extern也是常量,在shader里面不能修改,但可以从宿主程序里改。
以前的编译器没有强制这一点,现在新的强化了这一要求。

把extern 改成static运行成功

或者将D3DXCompileShaderFromFile的第六个参数改为D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY即可 




龙书: DX9游戏开发编程基础

龙书中的代码没有工程,只有.h.cpp文件
所以需要我们自己建工程


1.创建一个win32项目,如果一开始不小心创建为控制台,则可以在项目属性的链接器,系统,子系统中修改为windows
HLSL错误及如何执行龙书中的代码_第1张图片

许多新手在编程时经常遇到“无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用”这样的错误,最近看了一些这方面的书籍,现将解决方案大概叙述一下:

连接程序在负责连接可执行程序时,选择相应的c/c++运行时启动函数。如果设定了/subsystem:windows连接程序开关,那么连接程序会试图寻找WinMain或wWinMain函数。如果连个函数都不存在,那么就会返回一个“一个未解决的外部符号”(无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用)

同样,如果设定了/subsystem:console连接程序开关,那么连接程序就会试图寻找main函数或者wmain函数,如果找不到这连个函数是,连接程序返回unresolved externel symbol错误信息。

变成新手容易犯的一个错误是,创建应用程序时选择了错误的应用程序类型。例如,开发人员创建了一个新的Win32应用程序项目,并给这个项目创建了一个入口函数main。在这种情况下,创建应用程序时,开发人员就会看到一个连接程序的错误信息。这是因为Win32应用程序项目设置了/subsystem:windows连接程序开关,但是却找不到相应的Winmain或者wWinmain函数。这是侯你可以有以下几种解决方案。

1 将main函数改为Winmain函数

2 将/subsystem:windows开关改为/subsytem:console

3全部删除/subsytem:windows开关,让连接程序根据源代码中实现的函数进行正确的操作。

更改/subsystem:windows的方法:

右键点击项目,选择属性,会看到如下的选项框,点击连接器->系统,在右侧会看到“子系统”选项,在这里可以选择相应的连接程序开关 

2.将所有的文件都copy到工程的文件目录下,并添加.h.cpp和其他资源

HLSL错误及如何执行龙书中的代码_第2张图片

3.删除原有工程的含有main的文件(如果建立的是空项目,就不用删除了),如,test.cpp这样程序就会找到源代码中的mian入口了。然后忽略预编译头
HLSL错误及如何执行龙书中的代码_第3张图片

4.设置dx库,头文件,dll的路径

HLSL错误及如何执行龙书中的代码_第4张图片

5.链接库

HLSL错误及如何执行龙书中的代码_第5张图片

或者
#pragma comment(lib,"dxguid.lib") 
#pragma comment(lib,"d3d9.lib") 
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

6.编码

HLSL错误及如何执行龙书中的代码_第6张图片

选择多字节字符集

7.制作一个模板,以后就用它来添加代码了

8.当然,还没有完,需要到shader部分,由于编译器的版本的更新,还会出现如下的问题。
error X3025: global variables are implicitly constant, enable compatibility mode to allow

vector LightDirection;
LightDirection.w = 0.0f;

这就是报错的代码了,
全局变量是extern也是常量,在shader里面不能修改,但可以从宿主程序里改。
以前的编译器没有强制这一点,现在新的强化了这一要求。
将D3DXCompileShaderFromFile的第六个参数改为D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY即可 

      hr = D3DXCompileShaderFromFile(
           "diffuse.txt",
          0,
          0,
           "Main", // entry point function name
           "vs_1_1",
           //D3DXSHADER_DEBUG,
           D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY,
          & shader,
          & errorBuffer,
          & DiffuseConstTable);
9.龙书的shader的后缀名都是.txt,在vs2008中是没有高亮的,作为一个苛刻的程序员,必须要进行设计。
在工具->选项->文本编辑器->文件扩展名,中加上.txt,编辑器使用vc++,这样就能高亮了。
HLSL错误及如何执行龙书中的代码_第7张图片

你可能感兴趣的:(HLSL错误及如何执行龙书中的代码)