1.OpenGL:全称是(Open Graphics Library)一个开放的图形库,提供了跨平台,跨语言的图形程序接口。
2.OpenGL应用领域:视频、图像、图片处理;2D/3D游戏引擎开发;科学可视化;医学软件的开发;CAD(计算机辅助技术);虚拟实境(AR VR);人工智能等等
3.OpenGL ES:(OpenGL for Embedded Systems)是OpenGL的子集,专为手机、PAD和游戏主机等嵌入式设备设计的,是一个在移动平台上能够支持OpenGL最基本功能的精简规范。
4.使用OpenGL ES的原因
GPU(Graphics Processing Unit)图形处理器,显卡处理器,它是显卡的“心脏”,专为执行复杂的数学和几何计算而设计的,这些计算是图形渲染必须的。
因为CPU和GPU不能直接通信,会导致数据饥饿的问题,为了解决这个问题,运用到了OpenGL ES,实际上是开辟了一块儿缓冲区,可以直接把数据放到这个缓冲区,不需要数据传递,解决数据饥饿的问题。
(一 基本名词解释)
1.图元:图形软件包中描述图形元素的函数,即组成图像的基本单元。
2.OpenGL渲染管线
渲染流水线:显示芯片内部处理图形信号互相独立的并行处理单元!其实就是一系列有序的处理阶段的序列,用于把应用中的数据转化到OpenGL生成一个最终的图像的过程。
3.GLSL
GLSL(GL Shading Language)GL着色器语言,专门为图形开发设计的编程语言。
4.可编程管线的编程阶段
光栅化:将输入图元的数学描述转换为与屏幕位置对应的像素片元(其实就是把矢量图形转成像素点的过程)如下图:把圆形转成像素点的过程就是光栅化。
5.GLSL基本语法
1.注释:单行注释“//”,多行注释“/* */”
2.main函数没有返回值
3.每条语句后都有分号;
(二 GLSL变量)
变量命名规范:
1.变量名可包括,数字、字母、下划线、但数字的和字母不能作为变量名的开头
2.变量名不能包含两个连续的下划线
3.系统变量名以“gl”开头,所以自己命名的变量不能以“gl”开头
4.见名知意,多个单词组合,第一个单词首字母小写,其他单词首字母大写
1.标量:有大小,无方向
float a;
int b;
bool c;
初始化: float d=1.0f; //浮点数必须包括小数点".",末尾要加上"f"
2.向量:有大小,有方向
在着色器中的作用:存储颜色值,位置,纹理坐标
它可以看做是同样类型的标量组成,基本类型分为bool,int,float三种,每个向量可以由2个,3个,4个相同的标量组成
基本类型 | 2D向量 | 3D向量 | 4D向量 |
float | vec2(包含两个浮点数的向量) | vec3 | vec4 |
int | ivec2 | ivec3 | ivec4 |
bool | bvec2 | bvec3 | bvec4 |
a) vec3 xyz=vec3(0.1,0.2,0.3);
vec4 rgba=vec4(0.1,0.2,0.3,0.4)
b) 向量加长
vec3 xyz=vec3(0.1,0.2,0.3);
vec4 rgba=vec4(xyz,0.4);
c) 向量取短
vec4 rgba=vec4(0.1,0.2,0.3,0.4)
vec3 xyz=rgba.rgb;或者 vec3 xyz=rgba.xyz;
vec3 xyz=vec3(1.0);和vec3 xyz=vec3(1.0,1.0,1.0)是一个意思
3.矩阵
在3D开发中的作用:做位移变换
基本类型 | 矩阵类型 | 矩阵类型 | 矩阵类型 |
float | mat2 | mat3(3*3的矩阵) | mat4 |
mat4*4 第一个值表示列数,第二个值表示行数
mat3 m=mat3(1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0)
vec3 v1=vec3(1.0,2.0,3.0);
vec3 v2=vec3(4.0,5.0,6.0);
vec3 v3=vec3(7.0,8.0,9.0);
mat3 m=mat3(v1,v2,v3);
vec3 v4=(10.0,11.0,12.0);
mat4 m1=mat4(v1,1.0,v2,2.0,v3.3.0,v4,4.0);
分量:向量和矩阵都属于分量
4.采样器:
sampler2D 访问二维贴图
sampler3D 访问三维贴图
samplerCube 访问立方贴图
5.结构体:一组由相同类型或不同类型数据组成的集合;
6.数组:一组相同类型数据组成的集合
a) GLSL支持任意类型数组,包括结构体
b) 数组索引从0开始(不能为负,不能超范围)
c)数组可以定义大小,或者没有大小
float f[5];
float a; //未定义维数,可以重新声明
d)数组属于GLSL中的第一类型
数组在GLSL中有构造函数,可以作为函数参数和返回值
可静态初始化一个数组的值
float f[5]=float[5](1.0,2.0,3.0,4.0,5.0)
f)多维数组:float f[2][3];
7.类型修饰符
(1) attribute 顶点属性,只能表示顶点着色器中的属性
(2) Unifrom 一致变量,从宿主语言中通过OpenGL给GLSL传值
(3) Varying 易变变量,在顶点着色器和片元着色器中传值,实际上经过了一个光栅化的过程。顶点着色器和片元着色器的名字要一致
(4)const 常量,编译时不需要分配任何运行时资源
(5)in/out 输入/输出变量
(6)inout 即可输入也可输出
(7)discard 关键字 丢弃当前片元,终止片元着色器进行(只在片元着色器中使用)
GLSL的操作符及优先级
程序基本结构的案例:
uinfrom mat4 uMVPMatrix;
attruibte vec3 aPosition; //定义顶点的位置
attruibte vec2 aTexCoor; //定义纹理
varying vec2 vTextureCoord;
void positionShift(){
gl_Position = uMVPMatrix * vec4(aPosition,1); //计算结果传给内建变量gl_Postion
}
void main(){
positionShift();
vTextureCoord = aTexCoor;
}
2D向量 |