Tokyo0 2014-03-25
首先是一些基础概念和经验分享:
1、OpenGL是一个跨平台的图形渲染标准
2、OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。
OpenGL ES 是从 OpenGL 裁剪定制而来的,去除了 glBegin/glEnd,四边形(GL_QUADS)、多边形(GL_POLYGONS)等复杂图元等许多非绝对必要的特性。现在主要有两个版本,OpenGL ES 1.1针对固定管线硬件的,是以 OpenGL 1.5 规范为基础的。OpenGL ES 2.x 针对可编程管线硬件,参照 OpenGL 2.0 规范定义。
3、egl提供了opengles和本地窗口之间的关联
4、OpenGLES模拟器,这里的模拟器仅仅是一套api和dll(要与Android模拟器区分开)。主要用于非嵌入式平台(如windows)下运行opengles代码。
相关阅读:
=====================正文=====================
1、头文件:
#if !defined(HAVE_GLES)
#include <GL/gl.h>
#else
#include <GLES/gl.h>
#endif
2、Windows下可以使用eglport(http://sourceforge.net/p/eglport/code-0/3/tree/trunk/),android和ios下各有其对应实现,如果使用了SDL的话,基础框架如下:
#if !defined(HAVE_GLES)
#include <GL/gl.h>
#else
#include <GLES/gl.h>
#include "eglport.h"
#endif
#include <SDL/SDL.h>
int main( void )
{
// other stuff here
SDL_Init( SDL_INIT_VIDEO );
#if defined(HAVE_GLES)
if (EGL_Open())
exit(1);
#endif
// some more initialisations
SDL_Surface* screen;
#if !defined(HAVE_GLES)
screen = SDL_SetVideoMode( 800, 600, 0, SDL_HWSURFACE | SDL_OPENGL | SDL_FULLSCREEN);
#else
screen = SDL_SetVideoMode( 800, 480, 0, SDL_SWSURFACE | SDL_FULLSCREEN );
EGL_Init();
#endif
// the event loop
while( quit == 0 ) {
// management of the even and the game
#if !defined(HAVE_GLES)
SDL_GL_SwapBuffers();
#else
EGL_SwapBuffers();
#endif
}
// probably some more clean-ups here
#if defined(HAVE_GLES)
EGL_Close();
#endif
SDL_Quit();
return 0;
}
注意EGL_xxx系列函数的位置。
3、一些宏定义:
gles只支持浮点型
#define GLdouble GLfloat
#define GL_CLAMP GL_CLAMP_TO_EDGE
#define glClearDepth glClearDepthf
#define glOrtho glOrthof
#define glFrustum glFrustumf
#define glColor4fv(a) glColor4f(a[0], a[1], a[2], a[3])
#define glColor3fv(a) glColor4f(a[0], a[1], a[2], 1.0f)
#define glColor3f(a,b,c) glColor4f(a, b, c, 1.0f)
4、具体代码移植示例,因为gles去除了glBegin等函数,所以贴图、顶点绘制、画线等代码都有可能需要进行修改
a、没有颜色的普通矩形:
#if !defined(HAVE_GLES)
glBegin(GL_QUADS);
glVertex2f(-10,-10);
glVertex2f(10,-10);
glVertex2f(10,10);
glVertex2f(-10,10);
glEnd();
#else
GLfloat q3[] = {
-10,-10,
10,-10,
10,10,
-10,10
};
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, q3);
glDrawArrays(GL_TRIANGLE_FAN,0,4);
glDisableClientState(GL_VERTEX_ARRAY);
#endif