OpenGL与OpenGLES区别

OpenGL 即 Open Graphics Library,是一个功能强大、调用方便的底层图形库,它定义了跨编程语言、跨平台的专业图形程序接口,可用于二维或三维图像的处理与渲染。
OpenGL ES (OpenGL for Embedded Systems)是三维图形 API OpenGL 的子集。针对手机、PDA 和游戏主机等嵌入式设备而设计。

毫无疑问Android里是OpenGLES,Android 对应 OpenGL ES 的版本支持如下:

  1. Android 1.0 开始支持 OpenGL ES 1.0 及 1.1
  2. Android 2.2 开始支持 OpenGL ES 2.0
  3. Android 4.3 开始支持 OpenGL ES 3.0
  4. Android 5.0 开始支持 OpenGL ES 3.1

glsl语言

学习OpenGL,glsl我们必须要懂的语言。在这之前先看一下下面的图片吧,这是OpenGL的渲染流程,其他的大家了解了解就行,记住片元着色器顶点着色器我们在这两个着色器做处理就是使用glsl语言,这也是OpenGLES2.0开始提供给我们可编程的着色器。

Android ES OpenGL 怎么直接操作GPU 安卓opengl es_浮点数

先看一下这个所谓的顶点着色器吧,就是长这样的

in vec4 vPosition; //in 是输入的意思,vec4 向量,vPosition变量名
in vec4 vColor;
Unifrom mat4 ModelViewProjectionMatrix;
void main(){
glPosition = modelViewProjectionMAtrix* vPosition;
}

一、基本数据类型

void:空类型,即不返回任何值
bool:布尔类型,true/false
int:带符号的整数,signed integer
float:带符号的浮点数,signed scalar
vec2、vec3、vec4:n-维浮点数向量
bvec2、bvec3、bvec4:n-维布尔向量
ivec2、ivec3、ivec4:n-维整数向量
mat2、mat3、mat4:2x2、3x3、4x4 浮点数矩阵
1)解释一下向量:
vec2( flaot x,float y ),vec3( flaot x,float y,float z ),vec4( flaot x,float y ,float z,flaot w)
1.向量的初始化:
vec3 xyz=vec3(0.0,0.2,0.3);
vec4 rgba=vec4(0.0,0.2,0.3,1.0);
2.加长
vec3 xyz=vec3(0.0,0.2,0.3);
vec4 rgba=vec4(xyz,1.0);
3.取短
vec4 content=vec4(0.4,0.2,0.3,1.0);
vec3 xyz=content.rgb;
vec3 xyz=content.xyz;
//这样也是等价的,因为上面初始化向量content的第一位为0.4
float i=   (0.4==content[0]==content.x==conent.r);
float i=   (0.2==content[1]==content.y==conent.g);
.....(xyzw,rgba以此类推)
2)解释一下矩阵
1.初始化矩阵(3x3)
1.0,2.0,3.0
4.0,5.0,6.0
7.0,8.0,9.0

//直接初始化
mat3 m=mat3(1.0 , 2.0 ,3.0 , 4.0, 5.0, 6.0, 7.0 ,8.0 , 9.0);
vec3 column1=vec3(1.0 , 2.0 ,3.0 );
vec3 column2=vec3(4.0, 5.0, 6.0 );
vec3 column3=vec3( 7.0 ,8.0 , 9.0 );
//由向量初始化
mat3 m=mat3(column1,column2 ,column3);
vec2 column1=vec2(1.0 , 2.0 );
vec2 column2=vec2(4.0, 5.0 );
vec2 column3=vec2( 7.0 ,8.0 );
//向量加标量
mat3 m=mat3(column1 ,3.0,column2 ,6.0,column3 ,9.0);
2.取值
mat3 m=mat3(1.0 , 2.0 ,3.0 , 4.0, 5.0, 6.0, 7.0 ,8.0 , 9.0);
vec3 xyz=m[2];//获取矩阵的第二列,记住是列,也就是(3,6,9)
//获取指定得数
float s=m[1][1];
float s=m[1].y;

二、类型修饰符

uniform mat4 uMVPMatrix;
attribute vec3 aPosition;
attribute vec2 aTexCoor;
varying vec2 vTextureCoord;

attribute
①只有顶点着色器中会有这哥们(attribute )
②用来修饰 浮点数的标量 ,浮点数的向量 , 浮点数的矩阵变量,不能用于修饰其他类型
uniform
①主要出现在顶点和片元 着色器
②可以修饰所有的基本数据类型
verying
用来传递顶点着色器中的数据到片元着色器中
例如:顶点着色器 verying vec2 texture;
片元着色器 verying vec2 texture;

三、内置变量

1)顶点着色器的内建变量

输入变量:

gl_Position:顶点坐标
gl_PointSize:点的大小,没有赋值则为默认值1,通常设置绘图为点绘制才有意义。

2)片元着色器的内建变量

输入变量

gl_FragCoord:当前片元相对窗口位置所处的坐标。
gl_FragFacing:bool型,表示是否为属于光栅化生成此片元的对应图元的正面。
输出变量

gl_FragColor:当前片元颜色
gl_FragData:vec4类型的数组。向其写入的信息,供渲染管线的后继过程使用。

四、纹理采样器类型 说明

纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、textureCube、textureCubeLod及texture3D、texture3DProj、texture3DLod、texture3DProjLod等。

  1. texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样
  2. Lod后缀,只适用于顶点着色器采样
  3. Proj表示纹理坐标st会除以q

emmm…这篇先做这么多介绍吧!大家看不懂也没关系,后面篇章会结合各种案例来编写顶点和片元着色器,慢慢就会上手,到时不懂也可以回来查查