gpt4 book ai didi

C++、OpenGL - 渲染大量的……茶壶

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:15:22 28 4
gpt4 key购买 nike

我是 OpenGL 编程的新手。我的目标是设置面向对象的图形编程,我可以自豪地说我取得了一些进展。现在我遇到了不同的问题。

假设我们有可以制作一个、两个或多个旋转茶壶的工作程序。我通过在类里面使用列表来做到这一点。绘图功能的原始代码在这里:

void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

for(list<teapot>::iterator it=teapots.begin();it!=teapots.end();it++){
glTranslatef(it->pos.x,it->pos.y,it->pos.z);
glRotatef(angle,it->ang.x,it->ang.y,it->ang.z);
glutSolidTeapot(it->size);
glRotatef(angle,-it->ang.x,-it->ang.y,-it->ang.z);
glTranslatef(-it->pos.x,-it->pos.y,-it->pos.z);
}
glPopMatrix();
glutSwapBuffers();
}

一切都很好,但是当我绘制大量茶壶时(比如,两行 128 个),我的 fps 数值下降了。我不知道,如果这只是硬件限制或者我做错了什么?也许 glPushMatrix() 和 glPopMatrix() 应该更频繁地发生?还是更少?

最佳答案

您正在使用 OpenGL 的一个旧的、已弃用的部分(称为“立即模式”),其中所有图形数据每帧都从 CPU 发送到 GPU:在 glutSolidTeapot() 内部是执行类似于 glBegin(GL_TRIANGLES) 的代码,然后是大量的 glVertex3f(...),最后是 glEnd()。弃用的原因是因为它是一个瓶颈。 GPU 是高度并行的,能够同时处理许多三角形,但如果您的程序使用 glVertex3f 一次发送一个顶点,它们就无法做到这一点。

您应该了解现代 OpenGL API,在其中您首先创建一个“缓冲区对象”并将顶点数据加载到其中——基本上是将您的形状一次上传到 GPU 的内存中,向上- front — 然后您可以发出大量调用,告诉 GPU 使用该缓冲区对象中的顶点绘制三角形,而不必每次都再次发送所有顶点。

(不幸的是,这意味着您将无法使用 glutSolidTeapot(),因为它在即时模式下绘制并且不知道如何为缓冲区对象生成顶点数据。但是我我确定您可以在网络上的某个地方找到茶壶模型。)

Open.gl是我所知道的关于现代风格 OpenGL 的不错的教程,但我相信还有其他教程。

关于C++、OpenGL - 渲染大量的……茶壶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26075231/

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