glBindBuffer

因为工作需要改写了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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要绘制圆形,可以使用三角扇或三角形条带来逼近圆形。以下是使用三角扇绘制圆形的示例代码: ``` void drawCircle() { const int numSegments = 32; // 圆形的线段数 const float radius = 1.0f; // 圆形半径 // 顶点坐标和颜色数组 GLfloat vertices[(numSegments + 2) * 3]; GLfloat colors[(numSegments + 2) * 3]; // 圆心点 vertices[0] = 0.0f; vertices[1] = 0.0f; vertices[2] = 0.0f; colors[0] = 1.0f; colors[1] = 1.0f; colors[2] = 1.0f; // 计算圆周上的点的坐标和颜色 for (int i = 0; i <= numSegments; i++) { float angle = i * 2.0f * M_PI / numSegments; int offset = (i + 1) * 3; vertices[offset] = cos(angle) * radius; vertices[offset + 1] = sin(angle) * radius; vertices[offset + 2] = 0.0f; colors[offset] = 1.0f; colors[offset + 1] = 1.0f; colors[offset + 2] = 1.0f; } // 绘制三角扇 glBindBuffer(GL_ARRAY_BUFFER, buffer[VERTICES]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); glVertexPointer(3, GL_FLOAT, 0, 0); glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vertices))); glDrawArrays(GL_TRIANGLE_FAN, 0, numSegments + 2); } ``` 注意到圆形的顶点数是固定的,因此在画圆形时不需要使用索引缓冲区。在顶点坐标和颜色数组中,第一个顶点是圆心,其它顶点按逆时针顺序排列在圆周上。最后使用 `glDrawArrays` 函数绘制三角扇即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值