gpt4 book ai didi

performance - OpenGL - 快速纹理四边形?

转载 作者:行者123 更新时间:2023-12-04 16:40:57 25 4
gpt4 key购买 nike

我试图在 3D 空间中的随机位置显示尽可能多的纹理四边形。到目前为止,根据我的经验,如果不将 fps 显着降低到 30 以下(我的相机移动脚本变得滞后),我什至无法显示数千个。

现在我正在学习一个古老的教程。初始化OpenGL后:

glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0, 0, 0, 0);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

我设定了观点和视角:
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

然后我加载一些纹理:
glGenTextures(TEXTURE_COUNT, &texture[0]);
for (int i...){
glBindTexture(GL_TEXTURE_2D, texture[i]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TextureImage[0]->w,TextureImage[0]->h,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->pixels);
}

最后我使用以下方法绘制我的 GL_QUADS:
glBindTexture(GL_TEXTURE_2D, q);
glTranslatef(fDistanceX,fDistanceZ,-fDistanceY);
glBegin(GL_QUADS);
glNormal3f(a,b,c);
glTexCoord2f(d, e); glVertex3f(x1, y1, z1);
glTexCoord2f(f, g); glVertex3f(x2, y2, z2);
glTexCoord2f(h, k); glVertex3f(x3, y3, z3);
glTexCoord2f(m, n); glVertex3f(x4, y4, z4);
glEnd();
glTranslatef(-fDistanceX,-fDistanceZ,fDistanceY);

我发现所有这些代码都非常自我解释。不幸的是,据我所知,这种做事方式已被弃用。我在互联网上阅读了一些关于 PBO 和 vertexArrays 的模糊内容,但我没有找到任何关于如何使用它们的教程。我什至不知道这些对象是否适合实现我在这里尝试做的事情(屏幕上十亿个四边形没有延迟)。也许这里的任何人都可以给我一个明确的建议,我应该用什么来实现结果?如果您碰巧还有一分钟的空闲时间,能否简要介绍一下这些函数的使用方式(就像我对上面已弃用的函数所做的那样)?

最佳答案

Perhaps anyone here could give me a definitive suggestion, of what I should use to achieve the result?



结果是什么”?你没有很好地解释你想要完成的究竟是什么。您所说的只是您正在尝试绘制大量带纹理的四边形。你想用那些带纹理的四边形做什么?

例如,在给定相同的像素数据的情况下,您似乎正在创建具有相同宽度和高度的相同纹理。但是您将这些存储在不同的纹理对象中。 OpenGL 不知道它们包含相同的数据。因此,当您渲染四边形时,您会花费大量时间不必要地交换纹理。

如果你只是随机绘制它们来测试性能,那么这个问题是没有意义的。这样的测试毫无意义,因为它们完全是人为的。他们只测试这种人为场景,每次渲染四边形时都要更改纹理。

在不知道您最终要渲染什么的情况下,我唯一能做的就是提供一般的性能建议。按顺序(即:先做第一个,然后再做):
  • 停止为每个四边形更改纹理。您可以将多个图像打包在同一个纹理中,然后一次渲染使用该纹理的所有四边形,只有一个 glBindTexture称呼。四边形的纹理坐标指定它使用纹理中的哪个图像。
  • 停止使用 glTranslate定位每个单独的四边形。您可以使用它来定位四边形组,但您应该自己进行数学运算来计算四边形的顶点位置。一旦那些glTranslate调用消失了,您可以在单个 glBegin/glEnd 的空间内放置多个四边形一对。
  • 假设您的四边形是静态的(模型空间中的固定位置),请考虑使用 buffer object存储和 render with你的四元数据。

  • I read some vague things about PBO and vertexArrays on the internet, but i did not find any tutorial on how to use them.



    您是否尝试过 OpenGL Wiki ,其中有一个 pretty good list of tutorials (以及关于 OpenGL 的一般信息)?为了充分披露,我确实写了其中之一。

    关于performance - OpenGL - 快速纹理四边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622923/

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