大家好,我是林译川,今天我们来聊聊如何高效学习OpenGL ES 2.0规范。
学习OpenGL ES 2.0的路线,我个人建议是在已有图形学理解的基础上,先读OpenGL ES 2.0 full spec,读完spec后再学习书本《Addison.Wesley.OpenGL.ES.2.0.Programming.Guide.Aug》,编几个ES程序加深理解。接着再研究ES的硬件实现。
下面,我将根据这份学习笔记,为大家梳理一下OpenGL ES 2.0规范的核心知识点。
1. 介绍
从程序员的角度来看,OpenGL ES程序包含以下几个部分:
- 在framebuffer中开辟一个绘制窗口;
- 在绘制窗口中分配context companion API Khronos Native PlatformGraphicsInterface(EGL);
- OpenGL ES command:绘制点、线、面等几何的基本绘制单元;控制如何光栅化这些基本绘制单元的设置,例如光照,颜色,三维建模空间到二维可视空间的转换;framebuffer直接操作命令,例如读像素点。
2. OpenGL ES Operation
OpenGL ES是一系列控制图形硬件操作的命令。硬件实现者,需要提供给一个CPU软件接口。对于部分OpenGLES命令,是在CPU中用软件实现或者在图形硬件中实现,需要很好的划分。CPU软件可以获取大量的状态信息。
3. 基本GL操作
OpenGL ES 2.0支持OpenGL ES 1.0 shading language。
4. GL state
GL state 分两类,GL server类和GL client类。大多数state都是GL server类。
5. GL 命令语法
命令声明格式如下:rtype Name{1234}{Φ i f}{Φ v} ([args,] T arg1, …, T arg N [, args])
6. 基本GL操作
此框图可以很好的描述GL操作,具体实现不限于此框图中的结构和顺序。
7. GL Errors
命令enum GetError( void );返回上次调用该命令后GL发生的错误代码,调用间隔中发生的同类型错误只记录一次。
8. Primitives和顶点
GL中,使用顶点数组对应一系列基本属性,组成几何物体。7种几何物体如下:point, line strips, line segment loops, separatedline segments, triangle strips, triangle fans, and separated triangles。
9. 当前顶点state
Vertex shaders读写一个4个分量组成的顶点属性数组。数组从0开始索引,最大容量由实现中定义的常数MAX_VERTEX_ATTRIBS定义。
10. 顶点数组
顶点数组存于clientaddress space。Client可以指定最多MAX_VERTEXATTRIBS个数组对应一个或多个基本顶点属性。
11. Buffer Object
参考OpenGL vertexbuffer object,顶点数组可以存储在serveraddress space,VBO提供了vertex array(顶点数据在不同多边形共享)和display list(数据可以给多个client共享)的好处,而避免了vertex array(数据需要频繁的从client->server搬运)和display list(数据不能方便的修改)的坏处。
12. Vertex Shader
此部分需要阅读《OpenGL ES 2.0 Programming Guide》后,才能弄得比较明白。
13. Primitive Assembly和shader后顶点处理
顶点经过shader处理后,顶点根据mode组合成基本图元Primitive Assembly操作包含:裁剪坐标的透视除法,视图映射,包含深度范围缩放,基本图元裁剪,裁剪varying输出。
14. 坐标变换
shader输出顶点坐标gl_Position是在裁剪坐标系中,顶点的裁剪坐标经透视除法产生归一化设备坐标,然后经视图变换转化为窗口坐标。
15. 基本图元裁剪
裁剪体如下:wc <=xc<=wc wc<=yc<=wc wc<=zc<=wc 若基本图元是点,若在裁剪体外头,直接裁没了,若在里头,继续保留;若基本图元是线段,若线段全在里头,继续保留,若线段全在外头,裁没了,若部分在里头,求出和裁剪体的交点坐标和其他属性,构建新线段;对于线段P1P2与裁剪面的交点P有公式:P = tP1 + (1 -t)P2。 (0<=t<=1) 若基本图元是三角形,将三角形和六个裁剪面依次作处理,裁减可能会引起顶点个数的增加,从而构建新的多边形(可能是3,4,5边形)。
16. 光栅化
光栅化就是基本图元转换为屏幕上二维图像的过程。光栅化操作可以分两部分:a.标明窗口坐标系上哪一些正方形整数栅格被基本图元占据;b.给这些栅格指定颜色和深度信息。光栅化的结果传递给GL(per-fragment操作)的下一阶段,更新framebuffer中的相应数据。
17. 纹理
void ActiveTexture( enum texture );//指定active的纹理图像单元选择ACTIVE_TEXTURE;active的纹理单元可以用纹理图像命令处理,包括TexImage,BindTexture,TEXTUREi = TEXTURE0 + i,active的纹理图像单元选择初始值为TEXTURE0
18. Fragment Shaders
点、线、三角形光栅化后输出的Fragment的处理,归fragment shader管。
19. Per-Fragment 操作和framebuffer
framebuffer可分两类:a windows系统提供的缺省framebuffer对象;b 应用创建的非显示framebuffer对象。
20. 其他函数
Flush在一定时间内完成所有GL命令;Finish等待所有GL命令的完成;void Flush( void );void Finish( void );
21. Hints
void Hint( enumtarget, enum hint );target=GENERATE_MIPMAP_HINT hint=FASTEST/NICEST/DONT_CARE
22. 状态和状态需求
6.1 查询GL状态6.1.1 简单查询void GetBooleanv(enum value, boolean *data );void GetIntegerv(enum value, int *data );void GetFloatv(enum value, float *data );boolean IsEnabled(enum value );6.1.2 数值转换GetBooleanv:非零浮点数整数对应TRUE;GetIntegerv:布尔数对应1/0,浮点数舍入到最近的整数,例外是RGBA分量和DepthRangef值,清屏深度值,归一化坐标值根据表4.4转换;GetFloatv:布尔数对应1.0/0.0,整数值强制转化为浮点数;6.1.3 枚举查询voidGetTexParameter{if}v( enum target, enum value, T data );target=TEXTURE_2D/TEXTURE_CUBE_MAPvoidGetBufferParameteriv( enum target, enum value,T data );target=ARRAY_BUFFER/ELEMENT_ARRAY_BUFFERvoidGetFramebufferAttachmentParameteriv( enum target, enum attachment, enum pname,int *params );void GetRenderbufferParameteriv( enumtarget, enum pname, int* params );6.1.4 纹理查询booleanIsTexture( uint texture );6.1.5 字符串 Queriesubyte*GetString( enum name );name=VENDOR/RENDERER/VERSION/SHADING_LANGUAGE_VERSION/EXTENSIONS6.1.6 Buffer对象查询boolean IsBuffer(uint buffer);6.1.7 Framebuffer Object andRenderbuffer Queriesboolean IsFramebuffer( uintframebuffer );boolean IsRenderbuffer( uintrenderbuffer );6.1.8 Shader and Program Queriesboolean IsShader( uint shader );void GetShaderiv( uint shader, enumpname, int *params );boolean IsProgram( uint program );void GetProgramiv( uint program,enum pname, int *params );void GetAttachedShaders( uintprogram, sizei maxCount, sizei *count, uint *shaders );void GetShaderInfoLog( uint shader,sizei bufSize, sizei *length, char *infoLog );void GetProgramInfoLog( uintprogram, sizei bufSize, sizei *length, char *infoLog );void GetShaderSource( uint shader,sizei bufSize, sizei *length, char *source );void GetShaderPrecisionFormat( enumshadertype, enum precisiontype, int *range, int *precision );void GetVertexAttribfv( uint index,enum pname, float *params );void GetVertexAttribiv( uint index,enum pname, int *params );void GetVertexAttribPointerv( uintindex, enum pname, void **pointer );void GetUniformfv( uint program, intlocation, float *params );void GetUniformiv( uint program, intlocation, int *params );
以上就是OpenGL ES 2.0规范的核心知识点,希望对大家有所帮助。
我是林译川,关注新派编程网(www.xjpbg.com),了解更多编程知识。
