【发布时间】:2011-10-02 13:36:12
【问题描述】:
我试图在 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 的模糊内容,但我没有找到任何关于如何使用它们的教程。我什至不知道这些对象是否适合实现我在这里尝试做的事情(屏幕上的十亿个四边形没有延迟)。也许这里的任何人都可以给我一个明确的建议,我应该使用什么来实现结果?如果您碰巧还有一分钟的空闲时间,您能否简要介绍一下这些功能的使用方式(就像我对上面已弃用的功能所做的那样)?
【问题讨论】:
-
您可以考虑学习显示列表和顶点缓冲区对象。
-
@AlexandreC。那些不会有帮助的。他的问题是状态变化,缓冲区对象和显示列表无法修复。
标签: performance opengl