Opengl是一种跨平台的编程语言。可以对图形硬件设备访问的软件库,显卡基本都支持OpenGL,可能有些版本的不同。OpenglES是针对移动设备,手机游戏机等。OpenglES可以用于绘制3D图形,提高渲染效率,图像的处理。
OpenGL ES与OpenGL相比,需要考虑下面几个因素:
(1)OpenGL API规模庞大且复杂,OpenGL ES工作组的目标是创建适合于受限设备的API,为了实现这一目标,工作组从OpenGL API中删除任何冗余,在相同操作可以多种方式执行的情况下,采用最实用的方法,将多余的技术删除,指定几何形状就是一个好的例子,在OpenGL中应用程序可以使用立即模式、显示列表或者顶点数组,在OpenGL ES中,只存在顶点数组,而删除了立即模式和显示列表。
(2)删除冗余是个重要的目标,但是维护与OpenGL的兼容性也很重要,OpenGL ES尽一切可能设计成可以运行用OpenGL功能的嵌入式子集编写的程序,这是一个重要的目标,因为这使得开发人员可以使用两套API并开发使用相同功能子集的应用程序和工具。
(3)引入新功能来处理手持和嵌入式设备的特定限制,例如,为了降低电源消耗,提高着色器的性能,在着色语言中引入精度限定符。
(4)OpenGL ES的设计者旨在确保实现图像质量的最小功能集,在早期的手持式设备中,屏幕尺寸有限,必须尽可能保证在屏幕上绘制的像素质量。
(5)OpenGL ES工作组希望确保任何OpenGL ES实现都能够满足图像质量、正确性和稳定性的某种可接受和公认的标准,这通过开发相关的相容性测试来实现,OpenGL ES实现必须通过这些测试才能被视为兼容。
【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
C 音视频配套学习资料:点击莬费领取→
顶点数据:buffer是放置数据的地方,老外起的名字
顶点着色器:顶点数据传递给着色器,着色器通过glsl对顶点进行编辑
顶点变换:顶点数据有时需要矩阵变换
图元装配:顶点信息根据画图的需要,将一些点连接起来
光栅化:连接顶点的线段上用点拼接起来,三角形填充也用点
片元着色器:将所有的点通过片元着色器填充颜色或纹理图片
三、着色语言(shader)着色语言是一种类C的编程语言,但不像C语言一样支持双精度浮点型(double)、字节型(byte)、短整型(short)、长整型(long),并且取消了C中的联合体(union)、枚举类型(enum)、无符号数(unsigned)以及位运算等特性。 着色语言中有许多内建的原生数据类型以及构建数据类型,如:浮点型(float)、布尔型(bool)、整型(int)、矩阵型(matrix)以及向量型(vec2、vec3等)等。总体来说,这些数据类型可以分为标量、向量、矩阵、采样器、结构体以及数组等。 shader支持下面数据类型:
float bool int 基本数据类型
vec2 包含了2个浮点数的向量
vec3 包含了3个浮点数的向量
vec4 包含了4个浮点数的向量
ivec2 包含了2个整数的向量
ivec3 包含了3个整数的向量
ivec4 包含了4个整数的向量
bvec2 包含了2个布尔数的向量
bvec3 包含了3个布尔数的向量
bvec4 包含了4个布尔数的向量
mat2 2*2维矩阵
mat3 3*3维矩阵
mat4 4*4维矩阵
sampler1D 1D纹理采样器
sampler2D 2D纹理采样器
sampler3D 3D纹理采样器
samplerExternalOES 扩展采样器
1. 顶点着色器(vertex_shader)
// 把顶点坐标给这个变量, 确定要画画的形状
attribute vec4 vPosition;
//接收纹理坐标,接收采样器采样图片的坐标
attribute vec4 vCoord;
//变换矩阵, 需要将原本的vCoord(01,11,00,10) 与矩阵相乘 才能够得到 surfacetexure(特殊)的正确的采样坐标
uniform mat4 vMatrix;
//传给片元着色器 像素点
varying vec2 aCoord;
void main(){
//内置变量 gl_Position ,我们把顶点数据赋值给这个变量 opengl就知道它要画什么形状了
gl_Position = vPosition;
// 进过测试 和设备有关(有些设备直接就采集不到图像,有些呢则会镜像)
aCoord = (vMatrix * vCoord).xy;
}
顶点着色器主要是传入相应的Attribute变量、Uniforms变量、采样器以及临时变量,经过顶点着色器后生成Varying变量。如下图所示:
顶点着色器
(1)attribute变量(属性变量)只能用于顶点着色器中,不能用于片元着色器。 一般用该变量来表示一些顶点数据,如:顶点坐标、纹理坐标、颜色等。
(2)uniforms变量(一致变量)用来将数据值从应用程其序传递到顶点着色器或者片元着色器。 该变量有点类似C语言中的常量(const),即该变量的值不能被shader程序修改。一般用该变量表示变换矩阵、光照参数、纹理采样器等。
(3)varying变量(易变变量)是从顶点着色器传递到片元着色器的数据变量。顶点着色器可以使用易变变量来传递需要插值的颜色、法向量、纹理坐标等任意值。 在顶点与片元shader程序间传递数据是很容易的,一般在顶点shader中修改varying变量值,然后片元shader中使用该值,当然,该变量在顶点及片元这两段shader程序中声明必须是一致的 。例如:上面代码中应用程序中由顶点着色器传入片元着色器中的vColor变量。
(4)gl_Position 为内建变量,表示变换后点的空间位置。 顶点着色器从应用程序中获得原始的顶点位置数据,这些原始的顶点数据在顶点着色器中经过平移、旋转、缩放等数学变换后,生成新的顶点位置。新的顶点位置通过在顶点着色器中写入gl_Position传递到渲染管线的后继阶段继续处理。
【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
C 音视频配套学习资料:点击莬费领取→
#extension GL_OES_EGL_image_external : require
//SurfaceTexture比较特殊,需要用扩展OES
//float数据是什么精度的
precision mediump float;
//采样点的坐标
varying vec2 aCoord;
//使用正常的 sampler2D
uniform samplerExternalOES vTexture;
void main(){
//变量 接收像素值
// texture2D:采样器 采集 aCoord的像素
//赋值给 gl_FragColor 就可以了
gl_FragColor = texture2D(vTexture, aCoord);
}
此片元着色器的主要功能为根据接收的记录片元纹理坐标的易变变量中的纹理坐标,调用texture2D内建函数从采样器中进行纹理采样,如果是在Android中使用,是调用samplerExternalOES内建函数从采样器中进行纹理采样,得到此片元的颜色值。最后,将采样到的颜色值传给gl_FragColor内建变量,完成片元的着色。
片元着色器
(1)varying指的是从顶点着色器传递到片元着色器的数据变量
(2)gl_FragColor为内置变量,用来保存片元着色器计算完成的片元颜色值,此颜色值将送入渲染管线的后继阶段进行处理。
如果你对音视频开发感兴趣,或者对本文的一些阐述有自己的看法,可以在下方的留言框,一起探讨。