大家好,接下来为大家介绍OpenGL ES 3.x 着色器。

本节内容将用到上一节关于“OpenGL ES 3.x 着色器语言:shader language” 的知识。

OpenGL ES 3.x 常用的着色器有:顶点着色器、片元着色器。

1、顶点着色器(vertex shader)

顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的需求自行开发,大大增加了程序的灵活性。

一个简单的示例代码:

uniform mat4 uMVPMatrix;                             
in vec4 aPosition;                            
in vec2 aTextureCoord;                        
in vec4 aColor                                
out vec4 vColor                                  
out vec2 vTextureCoord;                          
void main()
{
    gl_Position = uMVPMatrix * aPosition;            
    vColor = aColor;                                 
    vTextureCoord = aTextureCoord;                   
}

android 片元着色器纹理 着色器单元_顶点着色器

顶点着色器的输入主要为待处理顶点相应的in 变量、uniform(一致)变量、采样器以及临时变量, 输出主要为经过顶点着色器后生成的 out 变量及一些内建输出变量。

a:in 变量:指的是 3D 物体中每个顶点各自不同的信息所属的变量,一般顶点 的位置、颜色、法向量等每个顶点各自不同的信息都是以 in 变量的方式传入顶点着色器的。

b:uniform 变量:指的是对于同一组顶点组成的单个 3D 物体中所有顶点都相同的量,一般为 场景中当前的光源位置、当前的摄像机位置、投影系列矩阵等。

c:out 变量:是从顶点着色器计算产生并用于传递到片元着色器的数据变量。 顶点着色器可以使用 out 变量来传递需要插值或不需要插值到片元的颜色、法向量、纹理坐标等 任意值。

d:内建输出变量 gl_Position、gl_PointSize 以及内建输入变量 gl_VertexID、gl_InstanceID 等。 gl_Position 是经过变换矩阵变换、投影后的顶点的最终位置,gl_PointSize 指的是点的大小。 gl_VertexID 用来记录顶点的整数索引。gl_InstanceID 是指实例 ID,只在顶点着色器中使用,对于 指定的每一组图元,该 ID 相应递增。

 

2、片元着色器(fragment shader)

OpenGL ES 3.0 的片元着色器同样是用于处理片元值及其相关数据的可编程单元,其可以执行纹理的采样、颜色的汇总、计算雾颜色 等操作,每片元执行一次。

precision mediump float;                           
in vec4 vColor;                               
in vec2 vTextureCoord;                        
uniform sampler2D sTexture;                        
void main()
{                                                                                   
    fragColor = texture2D(sTexture, vTextureCoord) * vColor;
}

此片元着色器的主要功能为根据接收的记录片元纹理坐标的易变变量中的纹理坐标,调用texture内建函数从采样器中进行纹理采样,得到此片元的颜色值。最后,将采样到的颜色值传给fragColor内建变量,完成片元的着色。

片元着色器是一个处理片元值及其相关联数据的可编程单元,片元着色器可执行纹理的访问、颜色的汇总、雾化等操作,每片元执行一次。片元着色器替代了纹理、颜色求和、雾以及Alpha测试,这一部分是需要开发者自己开发的。

android 片元着色器纹理 着色器单元_着色器_02

 

a:in 指的是从顶点着色器传递到片元着色器的变量,如pipeline管线那节所介绍,由系统在顶点着色器后的光栅化阶段自动产生,其个数是不一定的,取决于具体的需要。

b:out 变量一般指的是由片元着色器写入计算完成的片元颜色值的变量,一般在片元着色器 的最后,都需要对其进行赋值,最后将其送入渲染管线的后继阶段进行处理。