工具
几个有用的工具,用来抓取图形渲染帧,在分析其它项目以及排查渲染方面的 bug 时非常有用。
渲染帧抓取工具
OpenGLES 以及 shader 开发调试工具。
- shader 开发编辑器 kodelife,地址:https://hexler.net/products/kodelife
- shader 调试工具 GAPID,google 开源的一个项目,地址:https://github.com/google/gapid
- shader 调试工具 RenderDoc,地址:https://renderdoc.org/
- Adreno GPU Profiler
- RenderDoc
is a stand-alone graphics debugging tool.
- Tegra Graphics Debugger
- Intel® Graphics Performance Analyzers
- shader:RenderMonkey、FX Composer、OpenGL Shader Designer
- Tegra Debugger/SnapProfiler/Intel GPA
- Android:PerfHUD ES(Tegra)、Adreno Profiler(Adreno)、PVRTrace(PowerVR)、Mali Graphics Debugger(Mali)
- IOS:Xcode OpenGL ES Tools
GLSL Versions vs GLSL ES Versions
OpenGL / OpenGL ES Reference Compiler 
OpenGL ES 2.0 (ESSL #version 100)
OpenGL ES 3.0 (ESSL #version 300 es)
OpenGL 2.0 (GLSL #version 110)
OpenGL 2.1 (GLSL #version 120)
OpenGL 3.0 (GLSL #version 130)
OpenGL 3.1 (GLSL #version 140)
OpenGL 3.2 (GLSL #version 150)
OpenGL 3.3 (GLSL #version 330)
https://www.cnblogs.com/vertexshader/articles/2917540.html
OpenGL 3.0 的出现改变了过去 OpenGL 一定会向下兼容的特性,在一定程度上简化了 API 的臃肿以及增加了 API 的灵活度。
3.x 开始了一种全新的工作方式,我读过各种文章和评论,它们都希望“远离已弃用的功能,
例如 glBegin(),glEnd()”,但还有很多书我见过的教程都使用该方法。
从发展历程上看,OpenGL 1.0~OpenGL 1.5 是经典的固定管线时代;OpenGL 2.0~OpenGL 2.1 是固定管线和可编程管线并存的时代;OpenGL 3.0~OpenGL 4.x 开始是可编程管线崛起的时代。
GLSL Versions
from
from
from
GLSL Versions 
| GLSL 语法 |
OpenGL 版本 |
Date |
Shader Preprocessor |
| 1.10.59 |
2.0 |
30 April 2004 |
#version 110 |
| 1.20 .8 |
2.1 |
07 September 2006 |
#version 120 |
| 1.30.10 |
3.0 |
22 November 2009 |
#version 130 |
| 1.40.08 |
3.1 |
22 November 2009 |
#version 140 |
| 1.50.11 |
3.2 |
04 December 2009 |
#version 150 |
| 3.30.6 |
3.3 |
11 March 2010 |
#version 330 |
| 4.00.9 |
4.0 |
24 July 2010 |
#version 400 |
GLSL ES Versions
OpenGL ES and WebGL use OpenGL ES Shading Language (abbreviated: GLSL ES or ESSL). (Android, iOS, WebGL)
OpenGL 2.0(#version 110)发布于 2004 年,OpenGL 2.1(#version 120)发布于 2006 年,OpenGL ES 2.0 发布于 2009 年。
GLSL ES 语法 |
OpenGL ES 版本 |
WebGL 版本 |
Based on GLSL 语法 |
Date |
Shader Preprocessor |
| 1.00.17 |
2.0 |
1.0 |
1.20 |
12 May 2009 |
#version 100 |
| 3.00.6 |
3.0 |
2.0 |
3.30 |
29 January 2016 |
#version 300 es |
Base OpenGL Versions for OpenGL ES
OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。
| OpenGL ES Version |
OpenGL Version |
| OpenGL ES 1.0 |
OpenGL 1.3 |
| OpenGL ES SC 1.0 |
OpenGL 1.3 |
| OpenGL ES 1.1 |
OpenGL 1.5 |
| OpenGL ES 2.0 |
OpenGL 2.0 |
| OpenGL ES 3.0 |
OpenGL 4.0+ |
| Unity Macro |
Target platform |
| SHADER_API_GLES |
OpenGL ES 2.0 |
| SHADER_API_GLES3 |
OpenGL ES 3.0/3.1 |
历史
- 1992:OpenGL1.0~OpenGL 1.5 是经典的固定管线时代;
- 2004:OpenGL 2.0~OpenGL2.1 是固定管线和可编程管线并存的时代;
- 2008:OpenGL 3.0~OpenGL4.x 开始是可编程管线崛起的时代
- 划分出 core profile 和 compatibility profile
- 帧缓冲区对象
- 几何着色器
- 2010:4.0
- 2003: OpenGLES 1.0 - OpenGL 1.1 固定管线
- 2007: OpenGLES 2.0 Programable Vertex and Fragment Shaders
- 2012: OpenGLES 3.0 Texture arrays, Multiple Render Targets
- 2014: OpenGLES 3.1 Compute Shaders
- 2015: OpenGLES 3.2 Tessellation and Geometry Shaders
正文
OpenGL_ES_2.x 为可编程渲染管线(Programmable)而设计。
2.x 并不向下兼容 1.x。from 
- OpenGL_ES_1.x 为固定渲染管线(Fixed_Function)而设计。
- OpenGL_ES_2.x 为可编程渲染管线(Programmable)而设计。
- 没有 double 型数据类型,但加入了高性能的定点小数数据类型;
- 没有 glBegin/glEnd/glVertex,只能用 glDrawArrays/glDraw…;
- 没有实时将非压缩图片数据转成压缩贴图的功能,程序必须直接提供压缩好的贴图。
OpenGL ES 2.0 简单介绍 from
在线繁体字转换器 by
- 在 OpenGL ES 2.0 里也没有 OpenGL 的 matrix stack,程式开发者必须要自行计算投影矩阵以及各物件的
transform matrix,再传到 shader 里做计算;虽然在 GPU 端的程式是有矩阵计算的功能,但是在 CPU 端就需要自己实作矩阵计算的基本算法了。
- 在 OpenGL ES 里没有 glBegin() / glEnd() 这种 immediate mode 的函式,vertex 资料必须用 buffer object 或 vertex array 来处理。
- 取消了 GL_QUADS / GL_POLYGONS 这两种 primitive 类型。
- vertex 的所有资讯(包含本身的位置、颜色、normal 等等)都变成以抽象的 vertex attrib 来处理,需要自行定义并在 vertex shader 里计算。
- Lighting、material 也都是以抽象的形式,以 uniform 变数形式传进 shader 并自行计算。
数据类型
- i GLint 整数型
- f GLfixed 定点小数
- x GLclampx 限定型定点小数
- attritude:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。
- uniform:一般用于对于 3D 物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。
- varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。
- const:常量。
删除的功能
- glBegin/glEnd
- glArrayElement
- 显示列表
- 求值器
- 索引色模式
- 自定义裁剪平面
- glRect
- 图像处理(这个一般显卡也没有,FireGL/Quadro 显卡有)
- 反馈缓冲
- 选择缓冲
- 累积缓冲
- 边界标志
- glPolygonMode
- GL_QUADS, GL_QUAD_STRIP, GL_POLYGON
- glPushAttrib, glPopAttrib, glPushClientAttrib, glPopClientAttrib
- TEXTURE_1D、TEXTURE_3D、TEXTURE_RECT、TEXTURE_CUBE_MAP
- GL_COMBINE
- 自动纹理坐标生成
- 纹理边界
- GL_CLAMP、GL_CLAMP_TO_BORDER
- 消失纹理代表
- 纹理 LOD 限定
- 纹理偏好限定
- 纹理自动压缩、解压缩
- glDrawPixels, glPixelTransfer, glPixelZoom
- glReadBuffer, glDrawBuffer, glCopyPixels
Sample OpenGL ES 2.0
- glDrawArrays 等函数中数据必须紧密排列,即间隔为 0。
- 各种数据的堆栈深度较低。
OpenGL based Graphics : A state machine4
It's a state machine - Setup the stage, lighting, actors… Then draw it.
Setup
Handle = get_platform_specific_window_handle();
eglGetDisplay(handle);
eglInitialize();
eglBindAPI(EGL_OPENGL_ES_API);
eglChooseConfig();
eglCreateWindowSurface();
eglCreateContex();
eglMakeCurrent();
Actors
float afVertices [] = {...};
glEnableVertexAttribArray(0);
glVertexAttribPointer(VERTEX_ARRAY, GL_FLOAT, GL_FALSE, afVertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Show
eglSwapBuffers(eglDisplay, eglSurface);
参考资料快照
本文短链接:
If you have any questions or feedback, please reach out

.