我有
VGA兼容控制器:Intel Corporation 82G33/G31 Express集成图形控制器(版本10),位于Ubuntu10.10Linux上。
我在静态渲染每帧一个vbo。这个vbo有30000个三角形,3个灯光和一个纹理,我得到15帧/秒。
是智能卡坏了,还是我做错了什么?
驱动程序是英特尔标准的开源驱动程序。
我的代码:


void init() {
  glGenBuffersARB(4, vbos);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[0]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 3, vertXYZ, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[1]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 4, colorRGBA, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[2]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 3, normXYZ, GL_STATIC_DRAW_ARB);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[3]);
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat) * verticesNum * 2, texXY, GL_STATIC_DRAW_ARB);
}

void draw() {
  glPushMatrix();

  const Vector3f O = ps.getPosition();

  glScalef(scaleXYZ[0], scaleXYZ[1], scaleXYZ[2]);
  glTranslatef(O.x() - originXYZ[0], O.y() - originXYZ[1], O.z()
          - originXYZ[2]);

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[0]);
  glVertexPointer(3, GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[1]);
  glColorPointer(4, GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[2]);
  glNormalPointer(GL_FLOAT, 0, 0);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbos[3]);
  glTexCoordPointer(2, GL_FLOAT, 0, 0);

  texture->bindTexture();
  glDrawArrays(GL_TRIANGLES, 0, verticesNum);

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); //disabling VBO

  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

  glPopMatrix();
}

编辑:可能不清楚-初始化在不同的函数中,只调用一次。

最佳答案

一些提示:
使用这个数量的顶点,你应该交错数组。顶点缓存通常不包含超过1000个条目。交错数据当然意味着数据由一个vbo保存。
如果存在大量共享顶点,则使用gldrawArrays是次优的,这可能是(静态)地形的情况。而是使用gldrawerElements绘制。您可以使用索引数组来实现一些廉价的lod
实验给定给gldrawArrays的索引缓冲区中的顶点数。尝试最多2^14、2^15或2^16个索引的批处理。这又是为了缓解缓存压力。
在你的代码里最后两行

  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

我想你是说那些是gldisableclientstate。

08-16 02:50