好,给出一个最简单的像素shader(pixel shader)的例子,照例,这个程序什么也没作,只是把输入又输出了一下而已















关于这个程序,不需要说太多吧,应该能看懂大部分了吧
像素shader就是在每个像素进行光栅化(raster)处理期间在图形卡的GPU上执行的程序,赋予了我们直接操纵每个像素和访问像素纹理的能力。这样可以达到多种游戏力的特效效果,例如多纹理化(mulittexturing)等。相比于顶点shader必须输出一个POSITION 像素shader则必须输出一个COLOR或者是一个TEXCOORD信息,道理也是不言自明的吧
关于像素程序本身就说这么多吧,其实顶点shader和像素shader很像的东西,只是处理的对象的不同而已,理解了一个理解另一个自然很方便。
下面随便扯点关于hlsl本身的一些问题
关于上面的float4,这不是一个关键字,而只是标识一个向量(vector)数据类型,前面有说道过hlsl中向量是作为了一种基本的数据类型的,所以提供了对向量运算的天然支持,就是快,所以不必当心效率问题,说到向量,先得提下hlsl支持的基本数据类型,int ,float,half,double,bool,有点编程基础的兄弟都能明白,不过这里的int有点特殊,int和half不是所有的显卡都支持的,而且使用上也有很多限制,图形显示器处理float和int一样快的,是没有效率问题的,虽然现在的CPU也这样了,可是很多的编程书籍还是说float比int慢...这里要说的就是尽量用float就是了,具体的原因...一两句话说不清楚,哪天有空了再写上来,总之就是GPU的特殊性(哈哈~~)我记得得话一定写上来
你可以这样声明一个向量
vector(<type,size>)(括号表示可选,如果没有括号,则表示一个四元的向量)type参数表示的是这个向量中数据的类型,例如是float int什么的,size则是向量的大小,维数 例如,你可以声明一个四元向量:
float4 v;
vector v;
vector<float,4> v;
float v[4]; 以上这些声明表达的就是一个意思,看个人喜好了
初始化和C没什么区别 你可以这样,float4 V={0,0,0,0}
另一个非常常用的数据类型就是矩阵(matrix)了,矩阵就是向量的数组,有行矩阵和列矩阵的区别
声明一个矩阵,可以这样:
float4×4 M;
matrix<float,4,4> M;//原理同vector,初始化也是一样的
还有,说一个想到的,那就是顶点shader和像素shader之间的数据传递问题,这个主要是通过由顶点程序输出语义为TEXCOORD或者是COLOR的参数而像素程序调用,就是这样的...
好了,关于hlsl的基本语法就说这么多,其实主要是我烦了,一门语言的语法点显然是非常多的,要说得面面俱到那就是对着文档写书了,这个教程本来就没打算写成那样的东西,而且我也显然不是那块料,这里只是说一些基本的东西,能让你看得懂我以后写的一些东西,想深入的学习这么语言,一本好的书是必要的,现在市面上中文的比较少,不过很多blog都有写这样的东西,不一定全,不过你要认真研究了差不多了,要认真的话看E文去吧,不要说E文不好的故事,想优秀E文是少不了的,而且痛苦值暂时的,等哪天你有了阅读E文文章的能力,然后你发现找工作的时候基本都有这个要求的时候记得感谢我