本文你可以了解到
- 简单了解下OpenGL是啥
- OpenGL能做点啥
- OpenGL的工作流程
- OpenGL中用到的基本数据类型
简述
-
OpenGL(Open Graphics Library):是一个跨平台接口库,用于二维或者三维图像的处理和渲染。
-
可以做滤镜:亮度、对比度、饱和度、色调曲线、白平衡、灰度、素描、卡通、浮雕以及各种混合模式
-
OpenGL 接口需要运行与EGL环境中
-
GLSL(OpenGL Shading Language):着色器语言
渲染管线
- 几何图元:包括点、直线、三角形,均是通过顶点(vertex)来指定
- 模型:根据几何图元创建的物体
- 渲染:计算机根据模型创建图像的过程
- 帧缓冲区(FrameBuffer):保存图形硬件为控制屏幕上所有像素的颜色和强度所需的全部信息
- 指定几何对象
glGrawArrays
模式可选值
- GL_POINTS
- GL_LINES
- GL_TRIANGLE_STRIP
复制代码
-
顶点处理
-
根据模型视图和投影矩阵进行变换来改变顶点的位置
-
根据纹理坐标与纹理矩阵来改变纹理坐标的位置
-
如果涉及三维的渲染,还要处理光照计算和法线变换
这里输出是以gl_Position来表现具体的顶点位置,如果以点(GL_POINTS)来绘制几何图元,还应该输出gl_PointSize。
- 图元组装
阶段2后,模型顶点和纹理坐标均以确定,然后在图元组装阶段会根据应用程序送往图元的规则(GL_POINTS、GL_TRIANGLE_STRIP等)来将纹理组装成图元
- 栅格化操作
将图元数据分割为更小的单元(==片元==)并对应与帧缓冲区的各个像素。一个片元可能包含窗口的颜色、纹理坐标等属性。片元的属性是根据根据顶点坐标利用插值来实现的,栅格化操作实际上就是确定好每一个片元是什么
- 片元处理
通过纹理坐标取得纹理(texture)中相对应的片元像素值(texel),然后根据自己的业务处理来变换片元的颜色,这里输出的是g l_FragColor
,表示修改后的像素的最终结果。
- 帧缓冲操作
执行帧缓冲的写入操作,负责将最终的像素值写到帧缓冲区。
修饰符和基本数据类型
const
:声明非可写的编译时常量变量attribute
:用于经常改写的信息,只能在顶点着色器中使用uniform
:用于不经常更改的信息,可用在顶点着色器和片元着色器varying
:用于修饰从顶点着色器向片元着色器传递的变量
数据类型,int、float、bool
highp float:32bit : 一般用于顶点坐标vertex Coordinate medium float:16bit : 一般用于纹理坐标texture Coordinate lowp float:8bit : 一般用来表示颜色
//向量类型: 将物理坐标和纹理坐标传递到vertex shader中
attribute vec4 position;
//矩阵类型:传入矩阵改变原始的像素数据,4*4的浮点矩阵
uniform lowp mat4 colorMatrix;
//实例:传递一个矩阵到实际的shader中
glUniformMatrix4fv(colorMatrixLocation, 1, false, colorMatrix);
//纹理类型,一般在fragment shader中使用,二维纹理声明如下
uniform sample2D texSample;
//当客户端收到该句柄,就可以为它绑定一个纹理
glActiveTexture(GL_TEXTURE0);//激活纹理
glBindTexture(GL_TEXTURE_2D, texId);
glUniform1i(glUniformTexture, 0);
复制代码
传递类型:使用varying在vertex shader和fragment shader直接传递参数==version3有变化,使用会更简单点==
首先在vertex shader中声明这个类型的变量代替纹理的坐标点,并对这个变量进行赋值
attribute vec2 texcoord;
varying vec2 v_texcoord;
void main(void){
v_texcoord = texcoord;//计算顶点坐标
}
复制代码
然后在fragment shader中也声明同名的变量,再使用texture2D方法取出二维纹理中该纹理坐标点上的纹理像素值。
varying vec2 v_texcoord;
vec4 texel = texture2D(texSample, v_texcoord);
复制代码
内置变量
vec4 gl_position;//设置顶点转换到屏幕坐标的位置,vertex shader一定要更新这个变量
复制代码
float gl_pointSize;//在粒子效果的场景下,需要为粒子设置大小
复制代码
vec4 gl_FragColor;//指定当前纹理坐标所代表的像素点最终颜色值
复制代码