gpt4 book ai didi

c++ - OpenGL 渲染大量动态二维圆

转载 作者:太空狗 更新时间:2023-10-29 23:07:08 26 4
gpt4 key购买 nike

我看过一篇关于这个主题的类似帖子 here ,但是,我的问题有点不同。

我有一个 2D 图,它将由不同位置的不同大小的圆圈组成。目前,我的渲染方案使用一个显示列表来存储一个预先绘制的圆,用户可以使用 glScalef/glTranslatef 主动调整大小和翻译该圆。但是,因为我正在渲染数千个圆圈,所以调整大小和绘制变得非常慢。每个圆可以有不同的半径和颜色,所以这些事情必须在循环内完成。

当用户改变圆圈大小时,我可以尝试哪些方法来提高圆圈渲染的速度?我已经像上面的链接所说的那样研究了 VBO,但是对于我的对象大小不断变化的这种类型的应用程序,我会获得多少性能提升是模棱两可的。

最佳答案

because I am rendering thousands of circles, the resize and drawing becomes extremely slow

仅使用顶点数组,在具有 10,000 个圆的 Intel HD Graphics 3000 上每帧大约需要 60 毫秒:

// g++ -O3 circles.cpp -o circles -lglut -lGL
#include <GL/glut.h>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;

// returns a GL_TRIANGLE_FAN-able buffer containing a unit circle
vector< float > glCircle( unsigned int subdivs = 20 )
{
vector< float > buf;

buf.push_back( 0 );
buf.push_back( 0 );
for( unsigned int i = 0; i <= subdivs; ++i )
{
float angle = i * ((2.0f * 3.14159f) / subdivs);
buf.push_back( cos(angle) );
buf.push_back( sin(angle) );
}

return buf;
}

struct Circle
{
Circle()
{
x = ( rand() % 200 ) - 100;
y = ( rand() % 200 ) - 100;
scale = ( rand() % 10 ) + 4;
r = rand() % 255;
g = rand() % 255;
b = rand() % 255;
a = 1;
}

float x, y;
float scale;
unsigned char r, g, b, a;
};

vector< Circle > circles;
vector< float > circleGeom;
void init()
{
srand( 0 );
for( size_t i = 0; i < 10000; ++i )
circles.push_back( Circle() );
circleGeom = glCircle( 100 );
}

void display()
{
int beg = glutGet( GLUT_ELAPSED_TIME );

glClear( GL_COLOR_BUFFER_BIT );

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
double w = glutGet( GLUT_WINDOW_WIDTH );
double h = glutGet( GLUT_WINDOW_HEIGHT );
double ar = w / h;
glOrtho( -100 * ar, 100 * ar, -100, 100, -1, 1);

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 2, GL_FLOAT, 0, &circleGeom[0] );

for( size_t i = 0; i < circles.size(); ++i )
{
Circle& c = circles[i];
c.scale = ( rand() % 10 ) + 4;

glPushMatrix();
glTranslatef( c.x, c.y, 0 );
glScalef( c.scale, c.scale, 0 );
glColor3ub( c.r, c.g, c.b );
glDrawArrays( GL_TRIANGLE_FAN, 0, circleGeom.size() / 2 );
glPopMatrix();
}

glDisableClientState( GL_VERTEX_ARRAY );

glutSwapBuffers();

int end = glutGet( GLUT_ELAPSED_TIME );
double elapsed = (double)( end - beg );
cout << elapsed << "ms" << endl;
}

void timer(int extra)
{
glutPostRedisplay();
glutTimerFunc(16, timer, 0);
}

int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize( 600, 600 );
glutCreateWindow( "Circles" );

init();

glutDisplayFunc( display );
glutTimerFunc(0, timer, 0);
glutMainLoop();
return 0;
}

关于c++ - OpenGL 渲染大量动态二维圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501752/

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