一、openGL与openGL ES
1.openGL删除任何冗余得到openGL ES,保留最实用的方法
①适用设备:手持和嵌入式为目标的高级3D图形API
②openGLES优化:降低电源消耗、着色器处理性能提升(引入精度限定符)
二、基本概念及专有名词
1.基础名词
基础名词推荐阅读PDF文章:图形处理器架构(GPU_Architecture)与图形管线(Graphics_Pipeline)
①3D物体:任何物体,其几何形状都是由三角形组成的。三角形,或者任何图形,都由顶点组成。
图:物体对象、三角形、顶点
②顶点(vertex):具有空间坐标和其他信息(如颜色和纹理坐标)的点
图:具有棋盘格结构的立方体
③纹理(texture):映射到3D物体表面的图像,这会造成该物体由某种材料组成的幻觉。物体的顶点存储着纹理坐标(2维向量),用于指定纹理如何映射到任何给定表面。一个表面用到的纹理可能需要几百万个简单三角形纹理实现。
图:块结构三角形的纹理坐标
2.图形管线
即渲染流水线,将数据从3D场景转换成2D图像,最终在屏幕上显示出来的总过程。主要分为三个阶段:应用阶段、几何阶段和光栅阶段。
图:3D图像渲染管线
几何阶段:解析3D位置到屏幕位置→计算属性
光栅阶段:光栅三角形→三角形上顶点属性插值→阴影像素→解决能见度
<1>应用阶段:
主要是CPU与内存打交道,例如碰撞检测,计算好的数据(顶点坐标、法向量、纹理坐标、纹理)就会通过数据总线传给图形硬件 。
<2>几何阶段:
这个阶段也被称为“变换和光照”阶段。为了从3D场景转换到2D,场景中的所有物体都需要转换到几个空间。每个空间都有自己的坐标系。这些转换是通过一个空间的顶点转换到另一个空间的顶点来实现的。
①法向量
三维平面的法线是垂直于该平面的三维向量。曲面在某点P处的法线为垂直于该点切平面(tangent plane)的向量。
法线是与多边形(polygon)的曲面垂直的理论线,法线决定着曲面与光源(light source)的浓淡处理(Flat Shading),对于每个点光源位置,其亮度取决于曲面法线的方向。
如果一个非零向量n与平面a垂直,则称向量n为平面a的法向量。
②光照(lighting):
几何阶段的主要部分。是使用物体表面的法向量来计算的。通过摄像机的位置和光源的位置,可以计算出给定顶点的光照属性。
图:计算光照
N: 表面法向量 P:平面上的某个点
③视锥图
图:相机\眼睛 视图折线及裁剪平面
近裁剪面、视锥视图、远裁剪面
④视图空间到平面空间转换
图:从视图空间转到平面空间
<3>光栅阶段
将连续的数据转化成离散的数据。这里光栅阶段是指矢量图形转化成像素点的过程。
①片元:GPU需要遍历2D图像并进行转换将数据转化为大量“像素候选”,转换的像素候选即为片元(Fragment),片片元是包含位置,颜色,深度,纹理坐标等属性的数据结构。
②插值(Interpolation):从分配给每个图元顶点的顶点着色器输出生成每个片段值的机制。
图:光栅化三角形并插值其颜色值
图:光栅化阶段输入和输出
<4>可编程步骤
图形管线中可编程的步骤只有:顶点着色器和片元着色器
图:openGL ES3.0图形管线
①顶点着色器
实现了顶点操作的通用可编程方法;
【1】输入:
a.着色器程序:描述顶点上执行操作的顶点着色器程序源代码或者可执行文件;
b.顶点着色器输入(属性):顶点数组提供的每个顶点数据;
c.统一变量(uniform):顶点着色器使用的不变数据;
d.采样器:代表顶点着色器使用纹理的特殊统一变量类型。
【2】输出:顶点着色器输出变量,作为片元着色器的输入。
【3】示例:
#version 300 es
uniform mat4 u_mvpMatrix; //将位置从模型空间转化为规范化设备空间的矩阵
//输入到顶点着色器的属性
in vec4 a_position; //位置值
in vec4 a_color; //顶点颜色
//顶点着色器的输出作为片元着色器的输入
out vec4 v_color;
void main()
{
v_color = a_color;
gl_Position = v_mvpMatrix * a_position; //内建变量gl_Position,存变换后的位置信息
}
②片元着色器
为片段上的操作实现了可编程方法;
【1】片元着色器输入:
a.片元着色器程序:描述片段上所执行操作的片段着色器程序源码或者可执行文件
b.输入变量:光栅化单元用插值为每个片段生成的顶点着色器输出
c.统一变量:片段或者顶点着色器使用的不变数据
d.采样器:代表片段着色器所用纹理的特殊统一变量类型
【2】输出:一个或者多个颜色值。
【3】示例:
#version 300 es
precision mediump float;
in vec4 v_color; //从顶点着色器输出得到的顶点颜色
out vec4 fragColor; //输出片元颜色
void main()
{
fragColor = v_color;
}
三、EGL作用
EGL是Khronos渲染API(如:OpenGL ES)和原生窗口系统之间的接口。
注意:实现OpenGL ES时,无提供EGL的硬性需求(如:IOS就支持OpenGL但不支持EGL)。
<1>OpenGL ES命令需要渲染上下文和绘制表面
渲染上下文:存储相关的OpenGL ES状态;
绘制表面:用于绘制图元的表面,制定渲染所需的缓冲区类型(如:颜色缓冲区、深度缓冲区、模板缓冲区),还需制定所需的位深度。
<2>渲染前EGL执行步骤
①查询并初始化设备商可用的显示器
②创建渲染表面
③创建渲染上下文