https://blog.csdn.net/linshuhe1/article/details/51075783
在上篇文章中,我们提到了OpenGL ES 2.0中的两个非常重要的着色器,它们分别是顶点着色器和片元着色器,那么我们接下来的学习内容就从这两个着色器开始。在此之前,我们可以先来看一下OpenGL ES 2.0可编程管线的每个阶段如下图所示:
上图中的Vertex Shader和Fragment Shader就是前面所说到的顶点着色器和片段(片元)着色器。
一、顶点着色器的定义:
Vertex Shader顶点着色器,实现了一种通用的可编程方法操作顶点。
在编程中,顶点着色器的输入主要有:
1.Attributes——属性,顶点矩阵支持的Per_vertex数据
2.Uniforms——顶点着色器使用的常量数据
3.Samplers——被Uniforms使用的特殊类型,在顶点着色器的贴图中使用(是可选的)
4.ShaderProgram——顶点着色器编程源码或可执行的部分
对应的,顶点着色器的输出叫做varying变量:
在最初的光栅化阶段,这些变量被计算,作为片段着色器的输入,从顶点着色器的矩阵使用插补的方法产生片段着色器的变量,输入和输出如下图所示:
二、顶点着色器的作用:
顶点着色器被使用在传统的基于顶点的操作,例如位移矩阵、计算光照方程、产生贴图坐标。顶点着色器被应用指定,应用于客户的顶点转化。
假设我们此时要编写一个顶点着色器,需要有一个位置和颜色数据这两个输入属性,其中输入位置数据时4X4的矩阵,输出是变换后的位置和颜色:
- uniform mat4 u_mvpMatrix; // matrix to convert a_position
- // from model space to normalized
- // device space
- // attributes input to the vertex shader
- in vec4 a_position; // position value
- in vec4 a_color; // input vertex color
- // output of the vertex shader - input to fragment
- // shader
- out vec4 v_color; // output vertex color
- void main()
- {
- v_color = a_color;
- gl_Position = u_mvpMatrix * a_position;
- }
上述程序中,首先定义了一个uniform变量u_mvpMatrix,此变量用于存储模型的关联视图和投射矩阵(也就是输入和输出的位置转换关系),然后声明了a_position和a_color这两个表示顶点着色器的两个输入属性(位置和颜色),而gl_Position和v_color则表示输出的两个属性,其中gl_Position无需声明,因为它是OpenGL的内部属性。
三、基元装配和光栅化:
基元(图元):是能被OpenGL ES绘制的几何物体,这些绘图命令描述了一个顶点属性和基元几何体以及基元类型的集合。图元是由顶点组成的,顶点属性包括计算位置、颜色和贴图坐标的信息,他们将被输入到片段着色器中。
顶点着色器能绘制的几何图元包括三角形、直线、点,对每个图元必须判断是否位于投影平截体内,如果图元不完全在平截体内部,将被视图平截体剪贴,如果完全在平截体外,将被丢弃,然后顶点位置被转变为屏幕坐标,剔除操作也能够舍弃一些图元,依据图元位于正面还是背面,剪切和剔除后,图元进入光栅化阶段。
光栅化:是转化图元为二维片段的过程,被片段着色器执行,二维的片段像素能够被绘制在屏幕上。