opengles概览

目前有三个版本的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()。















































  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值