Я делаю что-то не так или графические карты Intel сосут так плохо? - PullRequest
1 голос
/ 19 января 2011

У меня есть

VGA-совместимый контроллер: Intel Corporation 82G33 / G31 Express Встроенный графический контроллер (версия 10) в Ubuntu 10.10 Linux.

Я отрисовываю статическиодин VBO на кадр.У этого VBO 30 000 треугольников, с 3 лампами и одной текстурой, и я получаю 15 FPS.

Карты Intel настолько плохи, или я делаю что-то не так?

Драйверы стандартные,драйверы с открытым исходным кодом от intel.

Мой код:


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();
}

РЕДАКТИРОВАТЬ: возможно, это не ясно - инициализация в другой функции, и вызывается только один раз.

Ответы [ 3 ]

4 голосов
/ 19 января 2011

Несколько подсказок:

  • Используя это количество вершин, вы должны чередовать массивы. Кеш вершин обычно не содержит более 1000 записей. Чередование данных, конечно, подразумевает, что данные удерживаются одним VBO.

  • Использование glDrawArrays является неоптимальным, если имеется много общих вершин, что, вероятно, относится к (статической) местности. Вместо этого рисуйте, используя glDrawElements. Вы можете использовать массив индекса для реализации некоторого дешевого 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.

0 голосов
/ 19 января 2011

Спасибо за ответы.

Да, у меня прямой рендеринг, согласно glxinfo.В glxgears я получаю 150 кадров в секунду, а игры вроде Warzone или glest работают достаточно быстро.Так что, вероятно, проблема в моем коде.

В любом случае, я все равно куплю настоящую графическую карту, но я хотел, чтобы моя игра работала и на интегрированных графических картах, поэтому я разместил этот вопрос.

0 голосов
/ 19 января 2011

Убедитесь, что в вашей системе включено ускорение OpenGL:

$ glxinfo | grep rendering
direct rendering: Yes

Если вы получили «нет», значит, у вас нет ускорения OpenGL.

...