GPU编程--hlsl--01

来源:百度文库 编辑:神马文学网 时间:2024/05/01 19:06:56

       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,道理是不言自明的吧