设为首页 加入收藏

TOP

将OpenGL代码移植成OpenGL ES
2014-11-24 00:35:29 来源: 作者: 【 】 浏览:11
Tags:OpenGL 代码 移植

首先是一些基础概念和经验分享:


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和本地窗口之间的关联


相关阅读


=====================正文=====================


1、头文件:


#if !defined(HAVE_GLES)
#include
#else
#include
#endif


2、Windows下可以使用eglport(http://sourceforge.net/p/eglport/code-0/3/tree/trunk/),android和ios下各有其对应实现,如果使用了SDL的话,基础框架如下:


#if !defined(HAVE_GLES)
#include
#else
#include
#include "eglport.h"
#endif

#include

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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL离线渲染和缓冲区对象 下一篇CMake并没有想象中好用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: