OpenGL ES 3.0

OpenGL ES 3.0 帧缓冲区对象基础知识

我们知道,在应用程序调用任何的OpenGL ES命令之前,需要首先创建一个渲染上下文和绘图表面,并使之成为现行上下文和表面,之前在渲染的时候,其实一直使用的是原生窗口系统(比如EAGL,GLFW)提供的渲染上下文和绘图表面(即帧缓冲区)。

一般情况下,我们只需要系统提供的帧缓冲区作为绘图表面,但是又有些特殊情况,比如阴影贴图、动态反射、处理后特效等需要渲染到纹理(Render To Texture/RTT)操作的,如果使用系统提供的帧缓冲区,效率会比较低低下。

对于系统提供的帧缓冲区,如果要实现RTT,有下面两种方式:

1.直接将帧缓冲区的对应区域赋值到纹理来实现RTT。借助glCopyTexImage2D/glCopyTexSubImage2D来从帧缓冲区复制颜色数据到纹理缓冲区,因为需要复制数据,所以操作比较慢,而且受限于EGLSurface的宽高尺寸,纹理的尺寸只能小于等于帧缓冲区尺寸大小。

梳理 Opengl ES 3.0 (五)shader运行原理

shader都是在运行时编译和执行的,每个shader都有一个main函数作为它的入口。

vertex shader的功能有两个:一个是计算顶点坐标变换,另一个就是为片元shader计算逐顶点信息。

梳理 Opengl ES 3.0 (五)shader运行原理

fragment shader在每个像素片上会执行,如上图的4和5,它的功能是计算片元即fragment的颜色值,一般来说,这类shader会计算颜色插值,纹理坐标计算,纹理提取,法线插值,光照,雾效等等。上图里的6是光栅化处理后的图像,framebuffer即帧缓存里的一个pixel是由一个或者任意多个fragment的信息组合而成,至于如何组合,就可以用程序来决定了,每个fragment都是可以用程序控制的对象。

现代的多核GPU针对大数据量的多边形转换计算以及浮点型运算进行了优化,能够并行处理大量数据。处理过程如下所示:

梳理 Opengl ES 3.0 (二)剖析一个GLSL程序

OpenGL ES shading language 3.0 也被称作 GLSL,是个 C风格的编程语言。

Opengl ES 3.0内部有两种可编程处理单元,即Vertex processor和Fragment processor,分别用来处理Vertex shader executable和Fragment shader executable。注意,Opengl ES 3.0不支持Geometry Shader。下图中,紫色部分就是可执行体了,即 executable .

梳理 Opengl ES 3.0 (二)剖析一个GLSL程序

先来一段Vertex shader代码

#version 300 es //版本号
in vec4 VertexPosition; //应用层输入逐顶点位置坐标数据
in vec4 VertexColor; //应用层输入逐顶点颜色数据
uniform float RadianAngle; //应用层输入数据

梳理 Opengl ES 3.0 (一)宏观着眼

Opengl ES 可以理解为是在嵌入式设备上工作的一层用于处理图形显示的软件,是Opengl 的缩水版本。

下图是它的工作流程示意图:

梳理 Opengl ES 3.0 (一)宏观着眼

注意图中手机左边的EGL Layer

Opengl ES是跨平台(即可支持不同操作系统)的软件。它如果想调用与系统相关,与硬件相关的操作,并不是通过直接访问操作系统,而是经过了一个中间层,即 EGL Layer,这个EGL layer当然也是Opengl es不可分割的一部分,失去了它,自然也就失去了和操作系统交互的方式了。不同的系统,要实现自己的EGL,比如在IOS系统下,定义了一个EAGL对象来实现EGL;在Android平台下,定义了GLView类,通过GLView.EGLContextFactory来提供EGL。EGL究竟提供了哪些内容,可以参考这个官方链接。

【视频】Dwarf Hall:PowerVR GPU上基于物理的渲染

该视频展示了如何在我们最新发布的OpenGL ES演示产品Dwarf Hall上使用PBR。

OpenGL ES 3.0 顶点缓冲区VBO使用

一般情况下数据都是有CPU从RAM取数据 然后传给GPU去处理,相对于GPU速度要慢一些。

使用VBO技术 可以把数据存储到GPU的内存空间中,这样GPU可以直接从GPU的内存中取得数据进行处理 速度会提升很多。

使用VBO,主要有3个函数

glGenBuffers() 申请缓冲对象

glBindBuffer() 绑定缓冲对象

glBufferData() 需要缓冲的数据 存储起来

下面演示用法

1

vertexBuffer 数据被存储到缓冲区中。

绘制的时候我们使用缓冲区的数据

2

对于大量的顶点,比如绘制一个3D汽车, 使用缓冲数据方式 能提高速度。

下面补充缺失的代码。

OpenGL ES 3.0片段着色器(四)

片段着色器流程图

Imagination 率先展示全新 Futuremark 3DMark OpenGL ES 3.0 基准测试

Imagination Technologies在2014世界移动通信大会(Mobile World Congress)上率先展出了在移动硬件上运行的 3DMark Cloud Gate 基准测试,令参展观众耳目一新。3DMark Cloud Gate 是一款面向移动平台的全新 OpenGL ES 3.0 基准测试,由世界领先的高性能基准测试软件供应商 Futuremark设计开发。

Imagination 于2014 世界移动通信大会 (Mobile World Congress) 中独家展示了在其 PowerVR Series6 Rogue GPU 上运行的 3DMark Cloud Gate。世界移动通信大会在西班牙巴塞罗那举行,Imagination 的展位号为 6E30。

3DMark 是一款受欢迎的跨平台基准测试,适用于台式机、笔记本电脑和移动设备等。3DMark Cloud Gate过去只适用于台式机和笔记本电脑,现在已经可以运行在采用最先进的 OpenGL ES 3.0 渲染器的 Android 和 iOS 设备上。

同步内容
--电子创新网--
粤ICP备12070055号