目前有三个版本的opengl es 1.0, 1.1 和2.0
1.0 和1.1是固定管线渲染,分别来自opengl 1.3和1.5。
2.0有可编程渲染管线,来自opengl2.0
opengl es2.0的shader执行两份标准:opengl es 2.0 api specification和
opengl es shading language specification。
可以从opengl es的颜色缓存中读回像素,深度和模板值不能读出。
opengl es中没有alpha测试和logic操作了,哈哈,因为alpha测试可以在fs中进行。
哈哈。
opengles2.0不兼容前面的1.1和1.0版本,因为他不支持固定管线,它只有可编程管线,
opengles2.0也是客户端服务器模式。
opengl es2.0程序需要的头文件和库:
#include <EGL/egl.h> //类似windows平台创建RC的那些函数的声明
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
libGLESv2.lib, libEGL.lib两个库。
1 只有顶点数组,缓存对象,没有立即模式,和显示列表
2 只支持双缓冲绘制。
可以渲染到pbuffer
可以渲染到纹理
2 为了省电,在shader中引入了precision qualifiers,。
3 egl2.0数据类型:
int EGLint
unsigned int EGLBoolean EGLenum
void* EGLConfig,EGLContext, EGLDisplay,EGLSurface
EGLClientBuffer;
GLfixed 类型时16.16的fixed point类型。
GLclampf 是浮点类型
错误处理:
GLenum glGetError(void);
GL_NO_ERROR,
GL_INVALID_ENUM
GL_INVALID_VALUE
GL_INVALID_OPERATION
GL_OUT_OF_MEMORY
一些独立于各个平台的标准的概念
以egl开头的函数是opengl es制定者定义的,各个平台都一样的标准函数。本地的窗口系统都要实现他们。
比如:和窗口系统通信,查询可用的类型,配置drawing surface,
创建drawing surface,和其他绘图函数做同步,管理渲染资源和纹理映射。
和本地窗口系统通信:
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
display= eglGetDisplay(EGL_DEFAULT_DISPLAY);//唯一的参数
if(display == EGL_NO_DISPLAY)
{
}
if(!eglInitialize(display,&majorVersion,&minorVersion)
{
}
//获取错误信息
EGLint eglGetError();
查询可用的surface配置:
opengl es可以和其他他api比如openVG共用一个窗口画图,因此需要同步:
egl等待别人完成:
EGLBoolean eglWaitClient();
别人等待egl
EGLBoolean eglWaitNative(EGLint engin);
emgin取值:EGL_CORE_NATIVE_ENGINE
opengl es与opengl的shader不同的一个地方是,opengl es可以指定数据类型的精度
有三种精度,highp,lowp,mediump
可以在shader的开头指定缺省精度,当你的数据类型没有指明精度的时候。
precision highp float;
precision mediump int;
在顶点shader里面,如果没有指定缺省精度,和数据类型的精度
那么,int和float默认是highp,所有都是最高精度。
片段shader的精度规则却不一样, 需要知道缺省精度,或者每个类型面前都指定精度。。
并且片段shader可能不支持float的highp,
可以这样来判定:
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
指定的这些精度到底都有几位呢,可以使用状态查询函数查询,每个设备可能不一样。
顶点shader的varying 变量或输出变量可以指定一个关键字:invariant,这个有什么意义呢?
这个主要是为了防止编译器优化,导致同一个shader在不同的情况下,变量的精度不一样
从而导致一些artifact,比如进行多通路渲染的时候,就可能由于这个原因导致z-fighting
现象。
invariant gl_Position;
invariant varying texCoord;
或者然所有的变量都带invariant:
#pragma STDGL invariant(all)
这个还是要看情况来用,不然编译器优化不起作用了。
glMapBufferOES() glUnMapbufferOES()更新顶点缓存对象,要更新就一次性全部更新
没有像opengl那样部分更新的函数。虽然是整个缓存对象一起更新,
glBufferData函数也是上传整个缓存对象的数据,但map函数会性能好些。
一个优化的方法是先调用glbufferdata(NULL),告诉gpu要更新缓存对象,
然后调用glMapBufferOES()。
1.0 和1.1是固定管线渲染,分别来自opengl 1.3和1.5。
2.0有可编程渲染管线,来自opengl2.0
opengl es2.0的shader执行两份标准:opengl es 2.0 api specification和
opengl es shading language specification。
可以从opengl es的颜色缓存中读回像素,深度和模板值不能读出。
opengl es中没有alpha测试和logic操作了,哈哈,因为alpha测试可以在fs中进行。
哈哈。
opengles2.0不兼容前面的1.1和1.0版本,因为他不支持固定管线,它只有可编程管线,
opengles2.0也是客户端服务器模式。
opengl es2.0程序需要的头文件和库:
#include <EGL/egl.h> //类似windows平台创建RC的那些函数的声明
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
libGLESv2.lib, libEGL.lib两个库。
1 只有顶点数组,缓存对象,没有立即模式,和显示列表
2 只支持双缓冲绘制。
可以渲染到pbuffer
可以渲染到纹理
2 为了省电,在shader中引入了precision qualifiers,。
3 egl2.0数据类型:
int EGLint
unsigned int EGLBoolean EGLenum
void* EGLConfig,EGLContext, EGLDisplay,EGLSurface
EGLClientBuffer;
GLfixed 类型时16.16的fixed point类型。
GLclampf 是浮点类型
错误处理:
GLenum glGetError(void);
GL_NO_ERROR,
GL_INVALID_ENUM
GL_INVALID_VALUE
GL_INVALID_OPERATION
GL_OUT_OF_MEMORY
一些独立于各个平台的标准的概念
以egl开头的函数是opengl es制定者定义的,各个平台都一样的标准函数。本地的窗口系统都要实现他们。
比如:和窗口系统通信,查询可用的类型,配置drawing surface,
创建drawing surface,和其他绘图函数做同步,管理渲染资源和纹理映射。
和本地窗口系统通信:
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
display= eglGetDisplay(EGL_DEFAULT_DISPLAY);//唯一的参数
if(display == EGL_NO_DISPLAY)
{
}
if(!eglInitialize(display,&majorVersion,&minorVersion)
{
}
//获取错误信息
EGLint eglGetError();
查询可用的surface配置:
opengl es可以和其他他api比如openVG共用一个窗口画图,因此需要同步:
egl等待别人完成:
EGLBoolean eglWaitClient();
别人等待egl
EGLBoolean eglWaitNative(EGLint engin);
emgin取值:EGL_CORE_NATIVE_ENGINE
opengl es与opengl的shader不同的一个地方是,opengl es可以指定数据类型的精度
有三种精度,highp,lowp,mediump
可以在shader的开头指定缺省精度,当你的数据类型没有指明精度的时候。
precision highp float;
precision mediump int;
在顶点shader里面,如果没有指定缺省精度,和数据类型的精度
那么,int和float默认是highp,所有都是最高精度。
片段shader的精度规则却不一样, 需要知道缺省精度,或者每个类型面前都指定精度。。
并且片段shader可能不支持float的highp,
可以这样来判定:
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
指定的这些精度到底都有几位呢,可以使用状态查询函数查询,每个设备可能不一样。
顶点shader的varying 变量或输出变量可以指定一个关键字:invariant,这个有什么意义呢?
这个主要是为了防止编译器优化,导致同一个shader在不同的情况下,变量的精度不一样
从而导致一些artifact,比如进行多通路渲染的时候,就可能由于这个原因导致z-fighting
现象。
invariant gl_Position;
invariant varying texCoord;
或者然所有的变量都带invariant:
#pragma STDGL invariant(all)
这个还是要看情况来用,不然编译器优化不起作用了。
glMapBufferOES() glUnMapbufferOES()更新顶点缓存对象,要更新就一次性全部更新
没有像opengl那样部分更新的函数。虽然是整个缓存对象一起更新,
glBufferData函数也是上传整个缓存对象的数据,但map函数会性能好些。
一个优化的方法是先调用glbufferdata(NULL),告诉gpu要更新缓存对象,
然后调用glMapBufferOES()。