opengl es学习笔记

opengl es 着色器

2017-07-05  本文已影响0人  Kira丶陈

着色器一种依赖于GPU硬件的程序,使用着色器语言编写,着色器语言有多种,这里使用的是基于OpenGL的GLSL,关于GLSL的详细信息大家可以自行在网上查阅,提供一个参考GLSL参考

这个需要补充个OpenGL渲染管线的知识,从csdn博客上搬运来的。

OpenGL 渲染管线示意图

上图即为OpenGL渲染管线的基本示意图,可以看出它像一个生产流水线一样,其中灰色部分为本文介绍的可以编程的着色器。至于其他部分做个简单的介绍:
Primitive Assembly:图元装配,经过着色器处理之后的顶点在该阶段被装配为OpenGL ES支持的基本图元(点、线、三角形),接着对装配好的图元进行裁剪,保留完全在视锥体中的图元,丢弃完全不在视锥体中的图元,对一半在一半不在的图元进行裁剪;接着再对在视锥体中的图元进行剔除处理;这个过程可编码来决定是剔除正面,背面还是全部剔除。
Rasterization:光栅化。在光栅化阶段,基本图元被转换为二维的片元(fragment),fragment 表示可以被渲染到屏幕上的像素,它包含位置,颜色,纹理坐标等信息,这些值是由图元的顶点信息进行插值计算得到的。这些片元接着被送到片元着色器中处理。这是从顶点数据到可渲染在显示设备上的像素的质变过程。
Per-Fragment Operation:在这一阶段对片元着色器输出的每一个片元进行一系列测试与处理,从而决定最终用于渲染的像素。

1、顶点着色器(Vertex Shader)

 attribute vec4 position;
 attribute vec2 texCoord;
 varying vec2 v_textureCoordinate;
 uniform mat4 modelViewProjectionMatrix;
 void main() {
     v_textureCoordinate = texCoord;
     gl_Position = modelViewProjectionMatrix * position;
 }

这里我只解释下当前shader里的各个字符的意思:

attribute是属性限定符,其修饰的变量用来接收渲染管线传递进顶点着色器的当前待处理顶点的各种属性值。用attribute限定符修士的变量其值是由宿主程序批量出入渲染管线的,管线进行基本处理后再传递给顶点着色器。数据中有多少个顶点,管线就调用多少次顶点着色器,每次将一个顶点的各种属性数据传递给顶点着色器中对应atribute变量。因此,顶点着色器每次执行将完成对一个顶点各项属性数据的处理。

uniform为一致变量限定符,一致变量指的是对于同一组顶点组成的单个3D物体中所有顶点都相同的量。Uniform变量可以用在顶点着色器或片元着色器中,其支持用来修饰所有的基本数据类型。一致变量的值也是从宿主程序传入的。

varying表示用于从顶点着色器传递到片元着色器的量。

vec4表示包含4个浮点数的向量,同理vec2表示包含2个浮点数的向量。由于GPU的特性,在运算中会大量使用向量和矩阵。

mat4表示一个4*4的浮点数矩阵。

gl_Position为系统内建变量,表示原始的顶点数据在顶点着色器中经过平移、旋转、缩放等数学变换后,生成新的顶点位置。这些内建变量不需要声明就可以使用,一般用来实现渲染管线固定功能部分与自定义顶点或片元着色器之间的信息交互。顶点着色器中的内建变量主要是输出变量,包括gl_Position、gl_PointSize等。在顶点着色器中应该根据需要给这些内建变量赋值,以便由渲染管线中的图元装配与光栅化等后续固定功能阶段进行进一步的操作。

2、片元着色器(fragment shader)

 precision mediump float;
 
 uniform sampler2D SamplerY;
 uniform sampler2D SamplerUV;
 
 varying mediump vec2 v_textureCoordinate;
 
 uniform mat3 colorConversionMatrix;
 
 void main() {
     mediump vec3 yuv;
     lowp vec3 rgb;
     
     yuv.x = texture2D(SamplerY, v_textureCoordinate).r - (16.0/255.0);
     yuv.yz = texture2D(SamplerUV, v_textureCoordinate).rg - vec2(0.5, 0.5);
     
     rgb = colorConversionMatrix * yuv;
     
     gl_FragColor = vec4(rgb, 1);
 }

precision precision-qualifier type表示指定默认精度。precision可以用来确定默认精度修饰符。type可以是int或float或采样器类型,precision-qualifier可以是lowp, mediump, 或者highp。顶点着色器是有默认精度的,而片元着色器没有。各个精度的标准如下:

GLSL 精度

sampler2D:sample表示采样器类型,实际上是纹理的不透明句柄。2D表示纹理的类型是2D的。它们用在内建的纹理函数来指明要访问哪一个纹理。它们只能被声明为函数参数或uniforms。除了纹理查找函数参数, 数组索引, 结构体字段选择和圆括号外,取样器不允许出现在表达式中。

texture2D:纹理查找函数。用于实现从指定纹理中查找某个坐标的纹理数据。

colorConversionMatrix:颜色变换矩阵,由OpenGL ES API指定。在解码视频或者流数据,我们一般会得到YUV数据,YUV到RGB颜色空间的转换可以通过颜色变换矩阵实现。当然,你也可以自己手动计算,具体方式可自行查阅。

3、如果只是显示一个RGB的图片,可以使用下面的shader:

precision mediump float;
 
 uniform sampler2D Texture;
 
 varying vec2 v_textureCoordinate;
 
 void main() {
     gl_FragColor = texture2D(Texture, v_textureCoordinate);
 }
上一篇下一篇

猜你喜欢

热点阅读