前言
OpenGL是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库,而OpenGL ES是OpenGL的子集,针对手机、PDA和游戏主机嵌入式设备而设计。OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性,剩下最核心有用的部分。
正文大纲
- OpenGL ES的名词解释
- 图元
- 顶点数据
- 片元
- 光栅化
- OpenGL渲染管线
- GLSL是什么
- 可编程管线的编程阶段
- 分析简单的顶点着色器
- GLSL变量认识
- GLSL支持的基本类型
- 什么是标量
- 变量命名规范
- 变量的初始化
- 类型转换
- 聚合类型
- 聚合类型-向量
- 聚合类型-矩阵
- 向量和矩阵内的元素访问
正文
OpenGL ES的名词解释
图元
官方的解释是图形软件用来描述各种图形的函数,可以理解为图元就是组成图像的基本单元。
顶点数据
在计算机中图元的位置是通过x,y,z,w来存储或颜色数据是通过RGBA的数组格式存储的,然后通过多个点来进行图元装配和光栅化出图形。
片元
元是光栅化过程的产物,光栅化是将一个图元转变为一个二维图象。
光栅化
光栅化是处理区域内的图元并生成片元数据。
OpenGL渲染管线
是显卡芯片内部处理图形信号相互独立的并行处理单元。也就是把数据转化到openGL并且生成最终图像的一个过程。
GLSL是什么
GLSL是一门专门为图形开发设计的编程语言。
可编程管线的编程阶段
顶点着色器,细分着色器和几何着色器是对顶点的处理,决定了图元的位置。裁剪,光栅化,片元着色器决定了片元的存在以及片元的颜色。
图上是OpenGL渲染管线的工作流,在顶点数据处理完毕后,需要通过着色器来达到最终的效果,顶点数据传递到顶点着色器数据后,顶点着色器单独处理每一个顶点,处理完毕后会激活细分着色器,细分着色器分为两部分,一部分是细分控制着色器,细分会对数据进行进一步处理,来描述物体的形状,在管线中生成新的几何体,然后将几何体进行平滑处理,然后把模型传递给几何着色器,对所有的图像进行修改,改变几何图元的类型,或者放弃掉所有图元。裁剪是将位置之外的的顶点剪切掉。光栅话将图元转化为屏幕的位置。片元着色器负责片元颜色以及深度值然后传递到片元测试和混合模块,最终渲染出效果。
分析简单的顶点着色器
#version 330 core
in vec4 vPosition;
in vec4 vColor;
unifrom mat4 modelViewProjectionMAtrix;
void main(){
//内置变量
glPosition = modelViewProjectionMAtrix * vPosition;
}
代码中in vec4 vPosition的in 代表数据的入口,是传递过来的,vec4代表(x,y,z,w)向量(w叫做齐次坐标)。vPosition变量名。
in vec4 vColor代表颜色,(R G B A)
unifrom mat4 modelViewProjectionMAtrix 来做矩阵变换
GLSL变量认识
GLSL支持的基本数据类型
类型 | 描述 |
---|---|
float | IEEE 32浮点值 |
int | 32位整数 |
bool | 布尔值 |
unnt double |
标量
只有大小没有方向的量
变量命名规范
1.数字和下划线不能作为开头
2.变量名不能包含连续的下划线
3.用户变量不能用“GL”开头
变量的初始化
float f=1.0;
bool b=true;
int i=15;
类型转换(win)
float f=1.0;
bool b=bool(f)
聚合类型
聚合类型-向量
向量就事有方向的量,用来存储位置,颜色和纹理的值的。
下边介绍基本数据类型
基本类型(标量) | 2d向量 3D向量 | 4D向量 |
---|---|---|
float | vec2 vec3 | vec4 |
int | ivec2 ivec3 | ivec4 |
bool | bvec2 bvec3 | bvec4 |
向量初始化
vec3 xyz=vec3(1.0,1.0,1.0);
float x= xyz.x;
vec3 rgb=vec3(1.0,1.0,1.0);
float r=rgb.r;
float g=rgb.g;
vec3 xyz1=vec3(1.0,1.0,1.0);
vec3 xyz2=vec3(xyz1);
上述的代码介绍了代码的初始化过程以及赋值过程。
聚合类型-矩阵
矩阵在3D开发中的作用
对于3d图形位移,旋转,缩放。
矩阵类型
double | dmat2 | dmat3 | dmat4 |
float | mat2 | mat3 | mat4 |
2*2的浮点数矩阵 | 3*3的浮点数矩阵 | 4*4的浮点数矩阵 | |
1.0,1.0 1.0,1.0 |
1.0,1.0,1.0 1.0,1.0,1.0 1.0,1.0,1.0 |
1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0 1.0,1.0,1.0,1.0 |
矩阵初始化
m=mat3(4.0)
如果只传一个值,对应的对角线的值都是4。其他地方都是0。
4.0 | 0 | 0 |
0 | 4.0 | 0 |
0 | 0 | 4.0 |
一下情况效果是一样的
mat3 m=(1.0,2.0,3.0,
4.0,5.0,6.0,
7.0,8.0,9.0);
vec3 f1=vec3(1.0,2.0,3.0);
vec3 f2=vec3(4.0,5.0,6.0);
vec3 f3=vec3(7.0,8.0,9.0);
mat3 m=mat3( f1,f2,f3 );
vec2 f1=vec2(1.0,2.0);
vec2 f2=vec2(4.0,5.0);
vec2 f3=vec2(7.0,8.0);
mat3 m=mat3(f1,3.0
,f2,6.0
,f3 ,9.0 );
1.0 | 4.0 | 7.0 |
2.0 | 5.0 | 8.0 |
3.0 | 6.0 | 9.0 |
向量和矩阵内的元素访问
什么是分量
分量是一种元素例如vec3 xyz=vec3(1.0,1.0,1.0);
xyz.x中的x就叫做元素。
分量名称三种形式的集合
分量访问符 | |
---|---|
(x,y,z,w) | 位置坐标 |
(r,g,b,a) | 颜色 |
(s,t,p,q) | 纹理坐标 |
向量内元素访问
向量使用分量的方式进行访问,矩阵可以以二位数组的方式进行访问。
vec3 rgb=vec3(1.0,1.0,1.0);
float r=rgb.r;
float g=rgb.g;
//数组方式获取
float r1=rgb[0];
以颜色举例,上边代码为取值方式。
矩阵内元素的访问
mat4 m=mat4(2.0);
vec4 xyzw = m[1];
float f=m[2][2];
上述代码首先获取第二列的向量,然后获取三行三列的具体值。