GPU就是图形处理器,随着硬件的发展越来越快,GPU的处理能力也今非昔比,现在GPU能够进行很复杂的数据处理,并且拥有某些CPU不同的处理特性。GPU语言就是用来用来控制GPU处理的一种语言吧...现在基本有两种,一种是NVIDIA的Cg(C for graphics 图形C语言)另一种是microsoft的HLSL(high level shader language 高级着色语言 天知道是不是这么拼的....)其实这两种是同样的语言,两家公司共同开发的,分别实现而已。我写的这个教程采用HLSL 没别的,我学的这个...哈哈...
简单的说了下我知道的历史,下面是正题。hlsl程序大多有两个部分组成(怎么说,算是吧,不过你要非只写一个,当然也是成立的,不过对复杂程序,一个是显然不够的),一个是顶点程序(vertex shader )另一个是像素程序(pixel shader),这两个程序从名字上看就知道是分别代替CPU渲染管线中的 顶点处理(vertex processing)和像素处理(pixel processing)的阶段工作,让CPU腾出更多的周期处理复杂的AI 什么什么的.cpu时钟周期是宝贵的.学游戏的都知道 关于历史和简介只说这么多吧,...
//顶点程序
//全局变量
vector color;
//输入结构
struct VS_INPUT...{
vertor position :POSITION;}
//输出结构
struct VS_OUTPUT...{
vertor position : POSITION;
vector color:COLOR;}
//主函数
VS_OUTPUT main(VS_INPUT)...{
VS_OUTPUT out;
out.position=VS_INPUT.posintion;
out.color=color;
return out;}
看上面的例子,hlsl的语法和c的语法其实是很像的,所有有c的基础的话对学习hlsl是非常有帮助的
我自己就最喜欢给出例子以后先告诉我怎么运行,不然看半天枯燥到死我早扔掉书了,所以,我先告诉你怎么运行一个hlsl顶点程序。
顶点程序保存为.txt文件。例如first。tet,创建一个简单的directx程序,然后可以调用 D3DXCompileShaderFromFile函数从first。tet中编译一个顶点着色器,具体代码如下:
IDirect3DVertexShader9* firstShader=0;//顶点着色器指针
//一个常量列表,用于给全局变量赋值
ID3DXCostantTable* firstConstTable =0;
D3DXHANDLE colorHandle =0;//你猜这个是什么??
ID3DXBuffer* shaderbuffer = 0;//创建一个buffer,编译后的shader保存在这里
//另一个buffer用于保存错误信息,如果有的话
ID3DXBuffer* errorbuffer = 0;
//编译着色器代码
D3DXCompileShaderFromFile( "first.tex",//顶点程序文件路径和文件名
0,
0.
"main",//入口函数名
"vs_3_1"//shader版本号
D3DXSHADER_DEBUG,//采用debug模式编译
&shaderbuffer,//指向编译后的指针
&errorbuffer,
&firstConstTable//常量列表);
//接下来创建电调着色器
g_pDevice->CreatVertexShader((DWORD*)shaderbuffer->GerBufferPointer,&firstShader);
/**//*接下来是对顶点程序中的全局变量赋值,着色器的全局变量被编译以后放在一个叫做常量列表的结构中,就是ConstTable,也就是编译函数D3DXCompileShaderFromFile的最后一个参数,具体的赋值过程是通过变量名获得指向着色器的句柄(handle),通过set函数和句柄为变量赋值,比如要设置这里的color就使用 SetVertor ,如果是矩阵那自然就是SetMatrix函数咯,具体过程如下:*/
D3DVEVTOR4 color =(1.0f,1.0f,0.0f,1.0f);//先定义一个vertor值
colorHandle =frestConstTable->GetConstantByName(0,//父亲指针表示,如果是最高级别即没有父,就是0
"color"//变量名);
//我们先把设置各个变量为默认值,这是个好习惯
firstConstTable->SetDefaults(g_pDevice);
//然后设置值
firstConstTable->SetVertor(g_pDevice,colorHandle,&color);
好了,把这段代码加到你的渲染代码里头 到这里,一个顶点程序就写完了。
其实这个顶点程序什么也没干,唯一的事情就是把颜色设置了一下而已,不过对学习基础来说,够了...
也许你要说,那还没有设置position的值呢,不,这个值不需要设置,而是由程序从要处理的顶点里头取得,这也是顶点程序的一个必要的参数,即一定要有position,道理是不言自明的吧