之前看了些GLSL的资料,做一点笔记。

两个免费的教程:

http://www.arcsynthesis.org/gltut/

http://en.wikibooks.org/wiki/GLSL_Programming

首先,由于Shader这个词被翻译成了着色器,让我误解了很久,其实Shader的工作远不止着色这么简单。

显卡将绘制图形将要使用的数据存放在显存中,Shader读取这些数据,并进行相应的运算,以得到最终要显示在屏幕上的图像。GPU运算之所以高效的原因在于,这些Shader虽然运算速度不如CPU,不过数量庞大,且精于浮点运算,而图像处理的重要特点就是非常容易并行化,经常是每个像素的结果可以独立的计算得到,于是通过并行的方法,就可以有效的提升运算效率。

OpenGL渲染的时候主要经过两个阶段:

1.顶点处理:此时主要使用Vertex Shader(顶点着色器),虽然叫顶点着色器,实际上其最主要的工作是计算顶点的位置:将3维平面中的点映射到2维的显示屏幕上。传统上,我们可以使用将该点的坐标乘以Model矩阵以得到其在世界坐标系中的位置,再乘以投影矩阵(比如做平行投影或透视投影),以将其映射成二维平面上的(x, y, depth)信息。 另外顶点着色器还可以计算顶点的其他属性(比如颜色,但逻辑上一个点的颜色并没有什么意义)输出给后面的阶段使用。

2.片段处理:此时使用Fragment Shader,由于顶点的位置确定,整个面的位置也都确定了,接下来要做的事情就是将整个面中每个点的颜色确定,这样就可以完成图像的绘制了。因此此时的输入就是面上每一个点的坐标,输出就是该点的颜色。此时可以利用各种别的输出,比如说之前顶点着色器给出的各种属性进行混色,比如处理光照啊什么的。总之混合的各种效果都是这样出来的。

以前的API中,这些Shader的模式都是固定的,使用者可以做的事情就是改改参数,比如设定下世界矩阵投影矩阵,设定下光源的位置和属性。中间的计算逻辑就是死的。而发展到后来,这些功能得到了开放,用户可以自己去编写Shader了,于是处理效果的灵活性得到了巨大的提升,因为你可以做任何你想要做的事情。甚至到后来连GPGPU技术都发展开了.......

GLSL的Shader加载过程很有意思,和C语言的编译+链接模式相同,先把各个源文件分别进行编译,之后再进行链接。C语言用户应该会非常的亲切 :)