OpenGL ES 2.0 Programme Guide
基础内容学习小结
1. OverView
ES2.0绘图管线示意图:
VertexArray : 绘图场景中所有的物体空间位置由点坐标数组构成。
VertexShader: 对每个点的位置进行变换,计算光照方程式生成每点的颜色,生成或者变换纹理坐标。基本结构示意图:
Attributes ---- 采用点向量数组形式传入的每个点的数据。
Uniforms ---- vertex shader 使用常量数量。
Sampler --- 表示纹理的特殊常量。可选。
Varying Variable -- Vertex Shader的输出变量,作为Fragment Shader的输入。必须与Fragment Shader中的输入Varying一一对应。
gl_Position 是每个点固有的Varying .表示点的空间位置。
Primitive Assembly : 管线中这个流程是对所有的点数据进行点线面等基础图元的组装。这个过程会对所有的图元进行剪切和筛选。对于不在视区空间中的部分进行剪切,对于不可见的面进行筛选。
Rasterization : 光栅化的过程就是对所有的经过Primitive Assembly图元转换成屏幕上可以显示的二维Fragment。
Fragment Shader:通过shader程序对Fragment进行处理。基本结构如下图:
Per-Fragment Operations :每个Fragment的操作。每个Fragment在屏幕上都有一个显示坐标(wx,wy)。基本流程:
这些流程基本是一些在frame buffer 中的2D像素操作。
2 OPENGL ES 2.0 及1.1的兼容性
2.0和1.1 不兼容。
1.1 几乎可看作是OPENGL的子集。采用固定管线编程。
2.0 则全部采用Shader语言来操作。
3 EGL
ES2.0绘图需要一个上下文context 和 绘图surface . Context用来存储ES2.0的管线状态机,surface则表示绘图的缓冲及其属性。EGL是一个介于OPENGL ES 绘图语言和本地视窗系统之间的中间层。因此EGL使得OPENG ES 的平台无关性。
基本流程:
1) Query the displays that are available on the device and initialize them.
2) Create a rendering surface.
3) Create a rendering context. Attach context before start doing graphic .
Eg:
eglDisplay = eglGetDisplay((EGLNativeDisplayType)0); //获取默认显示设备
eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion); //初始化,返回版本号
eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs); //选择一个配置。eglConfig是返回的配置,pi32ConfigAttribs是输入的配置属性,是一个int数组,以key-value的顺序存放属性和值。
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, (EGLNativeWindowType) NULL, NULL);//根据egl配置创建显示Surface。
eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, pi32ContextAttribs); //根据egl配置和上下文