将OpenGL代码移植成OpenGL ES

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

相关推荐

Tokyo0 / 0评论 2014-12-15

bingxuelengmei / 0评论 2014-12-04