openGL API 搭配讲解

    技术2025-04-08  34

        因为工作需要改写了xbmc里面的openGL部分代码,对opengl的API摸出来了些门道,写出来与大家分享,

    对自己也相当于是做个笔记。openGL API 并不多,常用的也就那么几个,有些API是需要搭配使用的。

    最经典的搭配莫过于glBegin  ..  glEnd了。下面是我整理的几个API搭配。

        1)    glBindBuffer + glVertexPointer+ glEnableClientState 的用法。

         glBegin .. glEnd已经是不推荐使用的方法。目前强烈推荐的是 glBufferData 搭配 glVertexPointer ,   

     glVertexAttribPointer 同系列函数的用法。

         原因是:利用glBindBuffer和glBufferData把vertex,color等数据 copy到server端的内存,然后glVertexPointer

    指向server端的内存地址。rendering 的时候能够提高性能。

         示例如下:

     

    typedef struct _TexVertex {   float u1, v1;   float u2,v2;   unsigned char r, g, b, a;      float x, y, z; }TexVertex;

     

         glBindBuffer(GL_ARRAY_BUFFER,  gl_buffer_id);  --事先生成的buffer id。      glBufferData(GL_ARRAY_BUFFER, sizeof(TexVertex) * 4(实际顶点个数),

                                                                    (char *)m_vertex, GL_DYNAMIC_DRAW);

              glVertexPointer( 3, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, x));      glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(TexVertex), (char *)offsetof(TexVertex, r));      .... 其它同系列函数 

          glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, u1));       glClientActiveTexture(GL_TEXTURE1);       glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, u2));       ..       glClientActiveTexture(GL_TEXTUREn);       glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, un));

          ..     glEnableClientState(GL_COLOR_ARRAY);     glEnableClientState(GL_VERTEX_ARRAY);       .... 其它同理

         glClientActiveTexture(GL_TEXTURE0);    ---多材质(纹理)的情况下,需要使用该函数,如果只有一个纹理,

    则可以省略。

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);     glClientActiveTexture(GL_TEXTURE1);        glEnableClientState(GL_TEXTURE_COORD_ARRAY);      .... 其它同理     glDrawArrays(GL_QUADS, 0, 4);

     

        glDisableClientState(GL_VERTEX_ARRAY); ---根据需要不一定非要disable掉。

     

        如果,有多个线程使用上述API的话,可能还有使用下面这对 API

          glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);

         glPopClientAttrib();

     

     

    2) glBindBuffer + glEnableVertexAttribArray + glVertexAttribPointer

     

         glBindAttribLocation  --- 绑定义自定义的属性名字到一个index.

         ..

         glBindBuffer(GL_ARRAY_BUFFER,  gl_buffer_id);  --事先生成的buffer id。      glBufferData(GL_ARRAY_BUFFER, sizeof(TexVertex) * 4(实际顶点个数),

                                                                    (char *)m_vertex, GL_DYNAMIC_DRAW);

     

         glEnableVertexAttribArray(GLUT_ATTRIBUTE_VERTEX);      glVertexAttribPointer(GLUT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(TexVertex), (char *)offsetof(TexVertex, x));

          ...... 其它同系列函数

          glDisableVertexAttribArray(GLUT_ATTRIBUTE_VERTEX);

          ...... 其它

     

    最新回复(0)