GPU编程入门(一)

该系列文章al  by  我就是条狗~~

随便说点我记得住的历史,学点历史是有用的,可以增加兴趣最少...

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,道理是不言自明的吧
好了,花了我一个多小时啊,写了这么点,算是体会到写书人的痛苦了....


关于上一个程序的一点解释

//顶点程序

//全局变量
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;}


 下面来解释一下基本的语法
首先说一下为什么保存为.txt的文件,而不定义一个特别的文件类型,这个其实shader程序来directx程序
里头就像是一个很长的字符串,是在没有必要定义一个文件类型...不过这样就貌似没有特别的IDE环境
哭.....
首先是定义了一个全局变量,类型为vector,就是一个四元向量(注意,hlsl里头把向量和矩阵当作原始类
型数据,也就是说,对向量的操作和对一个数的操作一样高效,这是图形处理的特殊性决定的),用这个向量来表示一个颜色。全局变量不需要后面说的类似:POSITION的标识符定义语义,原因就是全局变量不是在顶点程序里头初始化,而是通过我们上面看到的consttable初始化的

接着,我们定义了两个结构,分别是输入和输出结构,表示的就是顶点程序的输入和输出结构由”struct“关键字定义,和C语言和C++一样,具体的说我们定义的是一个顶点结构,是的,在顶点程序里头自然要定义顶点结构。接着是vertor position : POSITION这句里头的”:POSITION“这是一个语义(semantics),用来告诉程序这个变量是做什么的,不如这个表示的是位置信息,而后面的:COLOR表示的是散色光信息,而:TEXCOORD表示的就是纹理信息,这些等用到的时候再介绍。语义有定义好的许多,在高级程序里头,还可以自己定义语义语法实际是和底层的寄存器有关的,不过不知道也不影响使用,想知道,百度咯.....
下面是一个主函数,HLSL里头叫做入口函数,相当于C中的main函数。HLSL里头和C不同,没有确定的入口函数所以需要自己指定(也就是函数名可以任意,只要合法),这也带来了相当大的灵活性。函数的定义和C非常类似,一个返回类型,这里我们返回输出结构VS_OUTPUT,也可以是VOID,不过要有特别的语法来返回点什么,毕竟如果不返回你的顶点程序干嘛来着,关于这点,等下补充。然后是函数名,然后是参数列表。接下来做的事情就很明显了吧,申明一个输出结构,然后为每项分别赋值,然后是返回这个结构 。完了....*/

void main(in vertor position :POSITION,
           out vertor oposition : POSITION,
           out vector ocolor:COLOR)
...{
             oposition=position;
             ocolor=color;
}


向上面这样,就可以去掉输入和输出结构的定义了,这里,主要是用了in关键字表示这个参数的定义是用
来输入的,out表示用来输出的,这样就不用返回值了。这样对少量参数是使用的,对于复杂一点的顶点程序
还是建议使用结构,这是个好的编程习惯。。好,顶点程序就大概介绍到这里,下次就是片段程序了..


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gamedevers/archive/2007/05/21/1619876.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值