gpt4 book ai didi

linux - 我做错了什么,还是英特尔显卡太烂了?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:02 24 4
gpt4 key购买 nike

我有

VGA compatible controller: Intel Corporation 82G33/G31 Express Integrated Graphics Controller (rev 10) on Ubuntu 10.10 Linux.

我每帧静态渲染一个 VBO。这个 VBO 有 30,000 个三角形,有 3 个灯光和一个纹理,我得到 15 FPS。

是英特尔卡这么差,还是我做错了什么?

驱动程序是来自英特尔的标准开源驱动程序。

我的代码:


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 不是最佳选择,这很可能是(静态)地形的情况。而是使用 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。

关于linux - 我做错了什么,还是英特尔显卡太烂了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com