我是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();
}
Run Code Online (Sandbox Code Playgroud)
一切都很棒,但是当我画出大量的茶壶 - 比如两排128个 - 我的fps数量下降了.我不知道,如果只是硬件限制或我做错了什么?也许glPushMatrix()和glPopMatrix()应该更频繁地发生?还是不那么经常?
Wyz*_*a-- 11
你正在使用一个旧的,不推荐使用的OpenGL部分(称为"立即模式"),其中所有的图形数据都是从每一帧从CPU发送到GPU:内部glutSolidTeapot()是代码,它执行glBegin(GL_TRIANGLES)大量的操作glVertex3f(...),最后执行glEnd().被弃用的原因是因为它是一个瓶颈.GPU是高度并行的,并且能够同时处理许多三角形,但如果您的程序一次一个地发送顶点,则它们不能这样做glVertex3f.
您应该了解现代OpenGL API,首先创建一个"缓冲对象"并将顶点数据加载到其中 - 基本上将您的形状一次性上传到GPU的内存中,然后您可以发出大量的调用告诉GPU使用该缓冲区对象中的顶点绘制三角形,而不是每次都必须再次发送所有顶点.
(不幸的是,这意味着你将无法使用glutSolidTeapot(),因为它以立即模式绘制并且不知道如何为缓冲区对象生成顶点数据.但我相信你可以在网络上找到一个茶壶模型.)
对于现代风格的OpenGL,我知道Open.gl是一个不错的教程,但我确信还有其他的.
| 归档时间: |
|
| 查看次数: |
836 次 |
| 最近记录: |