在入门笔记一中比较详细的介绍了顶点着色器和片面着色器。

  在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Shaders和Fragment Shaders。

  Vertex Shaders,在你的场景中,每个顶点都需要调用的程序,成为“顶点着色器”。假如你在渲染一个简单地场景:一个长方形,每个角只有一个顶点。于是Vertex Shaders会被调用四次。她负责执行:灯光、集合变化等等的计算。得出最终的顶点位置后,为下面的Fragment Shaders提供必须的数据。

  Fragment Shaders,在你的场景中,大概每个像素都会调用的程序,称为“片面着色器”。在一个简单的场景,也就是刚刚说到的长方形。这个长方形所覆盖到的每一个像素,都会调用一次Fragment Shaders。片面着色器的责任是计算灯光以及更重要的是计算每一个像素最终的颜色。

  通过下面的简单例子来说明。

  在project中新建一个Empty文件,命名规则随意,例如:Simple.vertsh

attribute vec4 Position; //
attribute vec4 SourceColor; // varying vec4 DestinationColor; // void main(void) { //
DestinationColor = SourceColor; //
gl_Position = Position; //
}

解析:

  1.“attribute”声明这个Vertsh Shaders会接受一个传入的值,这个变量名为“Position”。在后面的代码中,你会用她来传入顶点的位置数据。这个变量的类型是vec4,标示这是一个由4部分组成的矢量。

  2.于上面同理,这里面是传入顶点的颜色变量。

  3.vary表示她是一个传出变量(入门笔记一中有讲到她是易变变量,其实更针对的说她是渐变变量),她就是传入Flagment Shaders的参数。

  4.Shader语言的开始入口其实也是main函数

  5.设置目标颜色(varying变量) = 传入变量(attribute)

  6.gl_Postition是一个内置的传入变量。这是一个在Vertex Shader中必须设置的变量。这里我们直接把gl_Postiion = Position;没有做任何逻辑运算。

  一个简单的Vertex Shader就是这样了,接下来我们再创建一个简单的Fragment Shaders。

  在Project中新建一个Empty文件,命名规则随意,例如:Simple.fragsh

varying low verc4 DestinationColor;    //

void main(void){ //
gl_FragColor = DestinationColor; // 3
}

解析:

  1.这是从Vertex Shaders中传入的一个变量,这里和Vertex Shader定义必须是一致的。而额外加了一个关键修饰字:lowp。在Fragment Shaders中,必须给出一个计算的精度,出于性能考虑,总使用最低精度是一个好习惯。这里就是设置成最低的精度。如果你需要,你可以设置成medp或者highp。

  2.Fragment Shaders也是从main函数开始执行的。

  3.正如你在Vertex Shaders中必须设置gl_Position,在Fragment Shaders中必须设置gl_FragColor。

  这里也是直接从Vertex Shaders中取值,不做任何改变。

  还可以吧?接下来我们运用Vertex Shaders和Fragment Shaders来创建一些3D图形。

04-26 10:12