将OpenGL代码移植成OpenGLES

来源:互联网 发布:国外的交流软件 编辑:程序博客网 时间:2024/06/18 15:55

将OpenGL代码移植成OpenGLES



http://blog.csdn.net/langresser_king/article/details/7891278


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

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、头文件:

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2. #include <GL/gl.h>  
  3. #else  
  4. #include <GLES/gl.h>  
  5. #endif  


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

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2. #include <GL/gl.h>  
  3. #else  
  4. #include <GLES/gl.h>  
  5. #include "eglport.h"  
  6. #endif  
  7.    
  8. #include <SDL/SDL.h>  
  9.    
  10. int main( void )  
  11. {  
  12.     // other stuff here  
  13.    
  14.         SDL_Init( SDL_INIT_VIDEO );  
  15. #if defined(HAVE_GLES)  
  16.         if (EGL_Open())  
  17.         exit(1);  
  18. #endif  
  19.    
  20.     // some more initialisations  
  21.         SDL_Surface* screen;  
  22.    
  23. #if !defined(HAVE_GLES)  
  24.         screen = SDL_SetVideoMode( 800, 600, 0, SDL_HWSURFACE | SDL_OPENGL | SDL_FULLSCREEN);  
  25. #else  
  26.         screen = SDL_SetVideoMode( 800, 480, 0, SDL_SWSURFACE | SDL_FULLSCREEN );  
  27.     EGL_Init();  
  28. #endif  
  29.    
  30.         // the event loop  
  31.         while( quit == 0 ) {  
  32.                 // management of the even and the game  
  33.    
  34.    
  35. #if !defined(HAVE_GLES)  
  36.             SDL_GL_SwapBuffers();  
  37. #else  
  38.         EGL_SwapBuffers();  
  39. #endif  
  40.         }  
  41.    
  42.     // probably some more clean-ups here  
  43.    
  44. #if defined(HAVE_GLES)  
  45.     EGL_Close();  
  46. #endif  
  47.         SDL_Quit();  
  48.    
  49.         return 0;  
  50. }  

注意EGL_xxx系列函数的位置。

 

3、一些宏定义:

gles只支持浮点型

[cpp] view plaincopy
  1. #define GLdouble     GLfloat  
  2. #define GL_CLAMP     GL_CLAMP_TO_EDGE  
  3. #define glClearDepth glClearDepthf  
  4. #define glOrtho      glOrthof  
  5. #define glFrustum    glFrustumf  

 

[cpp] view plaincopy
  1. #define glColor4fv(a) glColor4f(a[0], a[1], a[2], a[3])  
  2. #define glColor3fv(a) glColor4f(a[0], a[1], a[2], 1.0f)  
  3. #define glColor3f(a,b,c) glColor4f(a, b, c, 1.0f)  


4、具体代码移植示例,因为gles去除了glBegin等函数,所以贴图、顶点绘制、画线等代码都有可能需要进行修改

a、没有颜色的普通矩形:

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2.   glBegin(GL_QUADS);  
  3.   glVertex2f(-10,-10);  
  4.   glVertex2f(10,-10);  
  5.   glVertex2f(10,10);  
  6.   glVertex2f(-10,10);  
  7.   glEnd();  
  8. #else  
  9.     GLfloat q3[] = {  
  10.         -10,-10,  
  11.         10,-10,  
  12.         10,10,  
  13.         -10,10  
  14.     };  
  15.    
  16.     glEnableClientState(GL_VERTEX_ARRAY);  
  17.     glVertexPointer(2, GL_FLOAT, 0, q3);  
  18.     glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  19.     glDisableClientState(GL_VERTEX_ARRAY);  
  20. #endif  


b、贴图

[cpp] view plaincopy
  1. glBindTexture(GL_TEXTURE_2D, carac->TextureName);  
  2. #if !defined(HAVE_GLES)  
  3.       glBegin(GL_QUADS);  
  4.    
  5.       glTexCoord2f(0,0);  
  6.       glVertex3f(pos[0]-tailleX/2, pos[1]-tailleY/2, 0);  
  7.       glTexCoord2f(1,0);  
  8.       glVertex3f(pos[0]+tailleX/2, pos[1]-tailleY/2, 0);  
  9.       glTexCoord2f(1,1);  
  10.       glVertex3f(pos[0]+tailleX/2, pos[1]+tailleY/2, 0);  
  11.       glTexCoord2f(0,1);  
  12.       glVertex3f(pos[0]-tailleX/2, pos[1]+tailleY/2, 0);  
  13.    
  14.       glEnd();  
  15. #else  
  16.       GLfloat vtx1[] = {  
  17.         pos[0]-tailleX/2, pos[1]-tailleY/2, 0,  
  18.         pos[0]+tailleX/2, pos[1]-tailleY/2, 0,  
  19.         pos[0]+tailleX/2, pos[1]+tailleY/2, 0,  
  20.         pos[0]-tailleX/2, pos[1]+tailleY/2, 0  
  21.       };  
  22.       GLfloat tex1[] = {  
  23.         0,0,  
  24.         1,0,  
  25.         1,1,  
  26.         0,1  
  27.       };  
  28.    
  29.       glEnableClientState(GL_VERTEX_ARRAY);  
  30.       glEnableClientState(GL_TEXTURE_COORD_ARRAY);  
  31.    
  32.       glVertexPointer(3, GL_FLOAT, 0, vtx1);  
  33.       glTexCoordPointer(2, GL_FLOAT, 0, tex1);  
  34.       glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  35.    
  36.       glDisableClientState(GL_VERTEX_ARRAY);  
  37.       glDisableClientState(GL_TEXTURE_COORD_ARRAY);  
  38. #endif  


c、颜色渐变:

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2.     glBegin(GL_QUADS);  
  3.     glColor3d( .1, .1, .7);  
  4.     glVertex3d(0, 0, 0);  
  5.     glVertex3d(0, -pbarheight, 0);  
  6.     glColor3d( 0, 0, 0.5);  
  7.     glVertex3d((startupProgress / startupProgressSteps) * pbarwidth, -pbarheight, 0);  
  8.     glVertex3d((startupProgress / startupProgressSteps) * pbarwidth, 0, 0);  
  9.     glEnd();  
  10. #else  
  11.     GLfloat vtx1[] = {  
  12.         0, 0, 0,  
  13.         0, -pbarheight, 0,  
  14.         (startupProgress / startupProgressSteps) * pbarwidth, -pbarheight, 0,  
  15.         (startupProgress / startupProgressSteps) * pbarwidth, 0, 0  
  16.     };  
  17.     GLfloat col1[] = {  
  18.         .1, .1, .7, 1.0f,  
  19.         .1, .1, .7, 1.0f,  
  20.         0, 0, 0.5, 1.0f,  
  21.         0, 0, 0.5, 1.0f  
  22.     };  
  23.    
  24.     glEnableClientState(GL_VERTEX_ARRAY);  
  25.     glEnableClientState(GL_COLOR_ARRAY);  
  26.    
  27.     glVertexPointer(3, GL_FLOAT, 0, vtx1);  
  28.     glColorPointer(4, GL_FLOAT, 0, col1);  
  29.     glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  30.    
  31.     glDisableClientState(GL_COLOR_ARRAY);  
  32.     glDisableClientState(GL_VERTEX_ARRAY);  
  33. #endif  


d、三角形扇面:

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2.         glBegin(GL_QUAD_STRIP);  
  3.                 // Front  
  4.                 glVertex3f(-left, 0, front); // bottom left  
  5.                 glVertex3f(-left-wider, height, front+wider); // top left  
  6.                 glVertex3f( right, 0, front); // bottom right  
  7.                 glVertex3f( right+wider, height, front+wider); // top right  
  8.    
  9.                 // Right  
  10.                 glVertex3f( right, 0,-back); // bottom r  
  11.                 glVertex3f( right+wider, height,-back-wider); // top r  
  12.    
  13.                 // Back  
  14.                 glVertex3f(-left, 0, -back); // bottom right  
  15.                 glVertex3f(-left-wider, height, -back-wider); // top right  
  16.    
  17.                 // Left  
  18.                 glVertex3f(-left, 0, front); // bottom r  
  19.                 glVertex3f(-left-wider, height, front+wider); // top r  
  20.         glEnd();  
  21. #else  
  22.         {  
  23.         GLfloat vtx1[] = {-left, 0, front,      -left-wider, height, front+wider,       right, 0, front,        right+wider, height, front+wider};  
  24.         GLfloat vtx2[] = {right, 0, front,      right+wider, height, front+wider,       right, 0,-back,         right+wider, height,-back-wider};  
  25.         GLfloat vtx3[] = {right, 0,-back,       right+wider, height,-back-wider,        -left, 0, -back,        -left-wider, height, -back-wider};  
  26.         GLfloat vtx4[] = {-left, 0, -back,      -left-wider, height, -back-wider,       -left, 0, front,        -left-wider, height, front+wider};  
  27.         glEnableClientState(GL_VERTEX_ARRAY);  
  28.         glVertexPointer(3, GL_FLOAT, 0, vtx1);  
  29.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  30.         glVertexPointer(3, GL_FLOAT, 0, vtx2);  
  31.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  32.         glVertexPointer(3, GL_FLOAT, 0, vtx3);  
  33.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  34.         glVertexPointer(3, GL_FLOAT, 0, vtx4);  
  35.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  36.         glDisableClientState(GL_VERTEX_ARRAY);  
  37.         }  
  38. #endif  


e、使用int/short

[cpp] view plaincopy
  1. #if !defined(HAVE_GLES)  
  2.     glBegin(GL_QUADS);  
  3.         glTexCoord2i(0, 1); glVertex2i(-256, -256);  
  4.         glTexCoord2i(0, 0); glVertex2i(-256, 256);  
  5.         glTexCoord2i(1, 0); glVertex2i(256, 256);  
  6.         glTexCoord2i(1, 1); glVertex2i(256, -256);  
  7.     glEnd();  
  8. #else  
  9.         GLshort vtx1[] = {      -256, -256,     -256, 256,      256, 256,       256, -256       };  
  10.         GLshort tex1[] = {      0, 1,           0, 0,           1, 0,           1, 1            };  
  11.         glEnableClientState(GL_VERTEX_ARRAY);  
  12.         glEnableClientState(GL_TEXTURE_COORD_ARRAY);  
  13.    
  14.         glVertexPointer(2, GL_SHORT, 0, vtx1);  
  15.         glTexCoordPointer(2, GL_SHORT, 0, tex1);  
  16.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  17.    
  18.         glDisableClientState(GL_VERTEX_ARRAY);  
  19.         glDisableClientState(GL_TEXTURE_COORD_ARRAY);  
  20. #endif  


f、glRect

[cpp] view plaincopy
  1. #ifndef HAVE_GLES  
  2.       glRecti ( dx + min[0], dy + min[1],  
  3.                 dx + max[0], dy + max[1] ) ;  
  4. #else  
  5.         GLshort vtx1[] = { dx + min[0], dy + min[1],    dx + min[0], dy + max[1],       dx + max[0], dy + max[1],       dx + max[0],    dy + min[1]};  
  6.         glEnableClientState(GL_VERTEX_ARRAY);  
  7.         glVertexPointer(2, GL_SHORT, 0, vtx1);  
  8.         glDrawArrays(GL_TRIANGLE_FAN,0,4);  
  9.         glDisableClientState(GL_VERTEX_ARRAY);  
  10. #endif  


5、glDrawArrays渲染模式对应关系

[cpp] view plaincopy
  1. GL_POINTS -> GL_POINTS  
  2. GL_TRIANGLES -> GL_TRIANGLES (or GL_LINE_LOOP if glPolygonMode is set to GL_LINE)  
  3. GL_QUADS -> GL_TRIANGLE_FAN  
  4. GL_LINE_STRIP -> GL_LINE_STRIP  
  5. GL_LINE -> GL_LINE  
  6. GL_POLYGON -> GL_TRIANGLE_FAN  


6、所有贴图必须是2的整次幂,某些特殊情况会有更高的需求(如powervr显卡使用pvr贴图必须是正方形以及2的整次幂大小)。

7、部分情况下贴图会有黑边,可以使用参数 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 来规避这个问题。(并没有完美解决问题,只是大多数情况下正常显示)
0 0
原创粉丝点击