OpenGL学习随笔——顶点着色器(VertexShader)

No replies
Demi
Demi 的头像
Offline
Joined: 2017-03-07

顶点着色器对顶点实现了一种通用的可编程方法。

顶点着色器的输入数据由下面组成:

  •   Attributes:使用顶点数组封装每个顶点的数据,一般用于每个顶点都各不相同的变量,如顶点位置、颜色等。

  •   Uniforms:顶点着色器使用的常量数据,不能被着色器修改,一般用于对同一组顶点组成的单个3D物体中所有顶点都相同的变量,如当前光源的位置。

  •   Samplers:这个是可选的,一种特殊的uniforms,表示顶点着色器使用的纹理。

  •   Shader program:顶点着色器的源码或可执行文件,描述了将对顶点执行的操作。

顶点着色器的输出数据是varying(易变)变量,在图元光栅化阶段,这些varying值为每个生成的片元进行计算,并将结果作为片元着色器的输入数据。从分配给每个顶点的原始varying值来为每个片元生成一个varying值的机制叫做插值。

顶点着色器数据的输入和输出可以参考下图:

OpenGL学习随笔——顶点着色器(VertexShader)

顶点着色器可用于传统的基于顶点的操作,例如:基于矩阵变换位置,进行光照计算来生成每个顶点的颜色,生成或者变换纹理坐标。

另外因为顶点着色器是由应用程序指定的,所以你可以用来进行任意自定义的顶点变换。

下面是一个用OpenGL ES着色器语言编写的顶点着色器源码,这个顶点着色器使用一个position和跟它相关联的color数据作为输入数据,通过一个4×4矩阵变换位置,然后输出变换后的位置和颜色数据。

  // uniforms used by the vertex shader
  uniform mat4 u_mvpMatrix; // matrix to convert P from model
  // space to normalized device space.

  // attributes input to the vertex shader
  attribute vec4 a_position; // position value
  attribute vec4 a_color; // input vertex color

  // varying variables – input to the fragment shader
 varying vec4 v_color; // output vertex color

 void main()
 {
     v_color = a_color;
     gl_Position = u_mvpMatrix * a_position;
 }

第2行代码定义了一个uniform变量u_mvpMatrix,mat4表示4×4浮点数矩阵,该变量存储了组合模型视图和投影矩阵。

第6和7行代码定义了顶点着色器的输入数据:Attributes,vec4表示包含了4个浮点数的向量,a_position是顶点位置属性,a_color是顶点颜色属性。

第10行代码定义了varying类型的变量v_color,varying是用于从顶点着色器传递到片元着色器的变量,v_color是顶点着色器的输出数据,存储了每个顶点的颜色。

第12-16行的main函数是顶点着色器和片元着色器的入口。

第14行读取了顶点着色器输入属性中a_color的值,并把它赋值给输出数据v_color。

第15行的gl_Position 是内置的varying变量,不需要声明,顶点着色器必须把变换后的位置赋值给它。

来源:Aape Programm Life

--电子创新网--
粤ICP备12070055号