OPENGL、EGL

来源:互联网 发布:淘宝卖家中心登录 编辑:程序博客网 时间:2024/05/17 15:20


一、            OPENGL概述:

在OPENGL库中,有五个类,为:Cube、CubeRenderer、OpenGLDemo、OpenGLScreen和Renderer。其中,

1.1 Renderer是定义的接口;

1.2 CubeRenderer是Renderer接口的具体实现;

1.3  OpenGLDemo是程序的入口;

1.4  OpenGLScreen是程序进入后所显示的屏幕;

1.5  Cube是3D模型的定义;

1.6  另外,CubeRenderer负责从Cube中获取数据,然后将数据进行转换和显示。

1.7  在Blackberry用顶点数组法画图时,坐标原点是在正中间。

二、            OPENGL初始化:

OpenGLDemo应用程序的初始化过程如下:

2.1OpenGLDemo应用程序以OpenGLDemo类作为入口,在该类的静态main方法里新建了一个OpenGLDemo实例。

2.2 在OpengLDemo的构造函数里首先判断当前设备是否支持OpenGL,如果不支持OpenGL则弹出对话框提示用户并退出应用程序,如果支持OpenGL才继续执行初始化过程。

2.3 在设备支持OpenGL情况下创建一个OpenGLScreen实例。

2.4 在创建OpenGLScreen实例的过程中创建了一个CubeRender实例。

2.5 将第3步创建的OpenGLScreen实例显示出来。

2.6 调用OpenGLDemo的EnterEventDispatcher()方法进行事件循环。

2.7 部分代码如下:

//检测是否支持OpenGL

if(GLUtils.isSupported()){

      // 如果支持OpenGL则新建OpenGLScreen实例并显示该实例

OpenGLScreenscreen = newOpenGLScreen(newCubeRenderer());

pushScreen(screen);

}

2.8、 EGLBoolean eglBindAPI(EGLenum api);

       api:Specifiesthe client API to bind, one of EGL_OPENGL_API, EGL_OPENGL_ES_API, orEGL_OPENVG_API.

       If api is EGL_OPENGL_API, the currentrendering API is set to the OpenGL API.

       If api is EGL_OPENGL_ES_API, the currentrendering API is set to the OpenGL ES API.

       If api is EGL_OPENVG_API, the currentrendering API is set to the OpenVG API.

       If an error occurs, the current renderingAPI is unchanged.

三、OpenGL中的一些函数及作用(此栏的函数,是按照程序中使用的顺序排列)

3.1 清屏函数

原型:void glClear(intmask)

清屏函数,参数为清屏方式,有areGL_COLOR_BUFFER_BIT , GL_DEPTH_BUFFER_BIT , GL_ACCUM_BUFFER_BIT , andGL_STENCIL_BUFFER_BIT 四种。

 

3.2 矩阵变换的设置和当前矩阵的设置(暂时无法理解):

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

 

3.3 变换坐标系的函数:

glTranslatef(x, y, z);

沿着 X, Y 和 Z 轴移动。

3.3.1         X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。

3.3.2   OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。

3.3.2         中心左面的坐标值是负值,右面是正值。

3.3.4         注意:

移向屏幕顶端是正值,移向屏幕底端是负值。
移入屏幕深处是负值,移出屏幕则是正值。

沿着 X, Y 和 Z 轴移动。

 

注意:

在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。

         3.4 旋转函数:

                   gl.glRotatef(_angle,1.0f, 1.0f, 0.0f);

                   3.4.1 第一个参数是旋转的角度(度);

                   3.4.2 其他参数是旋转中心;

         3.5 开启OpenGL数组绘图功能

                   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

                 gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

       gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

其中第一句用于启动顶点数组支持,第二句用于启动法向量数组的支持,第三句用于启动纹理数组的支持

 

         3.6窗口变换函数

                   glViewport;

函数有四个参数,

3.6.1 第一个参数和第二个参数指定图片的左下角出现在什么位置;

3.6.2 第三个和第四个参数用于指定生成图片的宽和高。

         3.7绘制顶点函数

                   glVertexPointer;

3.7.1 带四个参数;

3.7.2 第一个参数为size,用于指定一个顶点由几个坐标值构成,参数必须是2、3或者是4

         3.8 绘图函数

                   voidglDrawArrays(int mode, int first, int count);

                   参数:mode:指定一个原始画图方式,可选:GL_POINTS ,GL_LINE_STRIP , GL_LINE_LOOP , GL_LINES , GL_TRIANGLE_STRIP , GL_TRIANGLE_FAN ,GL_TRIANGLES , GL_QUAD_STRIP , GL_QUADS , and GL_POLYGON;、

                   First:从第几个(数组中)元素开始画;

                   Count:Specifies the number of indices to be rendered.(经测试,应该是顶点数)

                   样例:gl.glDrawArrays(GL10.GL_TRIANGLES, 0,_vertexCount);

             

              参数 mode:

         3.8.1.GL_TRIANGLES:每三个顶之间绘制三角形,之间不连接

         3.8.2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式绘制三角

                3.8.3. GL_TRIANGLE_STRIP连接并渲染。

3.8.4. GL_POINTS只是画出点,不连接,不渲染。

  3.8.5. GL_LINE_STRIP,按照点的顺序,用线一次连接,但是不闭合。

  3.8.6. GL_LINE_LOOP:封闭线

   3.9 …(程序之中,此函数应在3.7函数之前)

                   void glVertexAttribPointer(GLuint index​, GLint size​, GLenum type​,GLboolean normalized​, GLsizei stride​, const GLvoid * pointer​);

                 voidglVertexAttribIPointer(GLuint index​, GLint size​, GLenum type​, GLsizeistride​, const GLvoid * pointer​);

                 voidglVertexAttribLPointer(GLuint index​, GLint size​, GLenum type​, GLsizeistride​, const GLvoid * pointer​);

void glVertexPointer(GLint size, GLenum type, GLsizei stride, constGLvoid * pointer);

 

 

 

1、参数:

3.9.1.1 index

指定要修改的顶点属性的索引值

        3.9.1.2size

指定每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。(梦维:如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a))

 3.9.1.3 type

指定数组中每个组件的数据类型。可用的符号常量有GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT,GL_UNSIGNED_SHORT, GL_FIXED, 和 GL_FLOAT,初始值为GL_FLOAT。

 3.9.1.4 normalized

指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)。如果normalized被设置为GL_TRUE,意味着整数型的值会被映射至区间[-1,1](有符号整数),或者区间[0,1](无符号整数),反之,这些值会被直接转换为浮点值而不进行归一化处理。

        3.9.1.5stride

指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。指定了一个属性到下一个属性之间的步长。

        3.9.1.6pointer

指定一个指针,指向数组中第一个顶点属性的第一个组件。初始值为0。

         2、错误

3.9.2.1 GL_INVALID_ENUM错误:如果 type 不是可接受的值。

 

3.9.2.2 GL_INVALID_VALUE错误: 如果 index 大于等于 GL_MAX_VERTEX_ATTRIBS.

 

3.9.2.3 GL_INVALID_VALUE错误: 如果 size 不是 1, 2, 3, 或 4.

 

3.9.2.4 GL_INVALID_VALUE错误: 如果 stride 小于零.


 

四、BlackBerry GL程序创建:

4.1 要创建一个EGL程序,首先得建立个context以及一个window。如下:

//新建一个context

screen_context_tscreen_ctx;

screen_create_context(&screen_ctx,0);

//新建一个window

screen_window_tscreen_win;

screen_create_window(&screen_win,screen_ctx);

4.2 之后,初始化EGL,代码如下:

         //创建一个EGL实例

EGLDisplayegl_disp;

egl_disp =eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(egl_disp,NULL, NULL);