gpt4 book ai didi

opengl - 使用 OpenGL 有效地绘制大量多边形?

转载 作者:行者123 更新时间:2023-12-03 18:26:55 24 4
gpt4 key购买 nike

我目前正在使用 opengl 绘制数千个多边形,但运行速度非常慢。绘制 8000 个多边形需要 apx 100 毫秒。

以下是有关我的设置的一些信息:

  • 我将 3d 字段中的每个对象都设置为 2d 多边形平面的集合,因此一个正方形将由 6 个、4 个顶点的平面组成。所以我确实可以访问每个单独的飞机。
  • 我不能保证每个多边形都有相同数量的顶点
  • 我目前正在绘制如下:
    for(allPlanes){
    glBegin(GL_POLYGON);
    for(allPointsInThePlane){
    glVertex(pointX,pointY,pointZ);
    }
    glEnd();
    }

  • 这比我预期的要慢得多,我已经考虑使用 glDrawElements() 代替并将多边形平面分成三角形并使用三角形扇形或 strip 来绘制它们。

    我只是在寻找一些关于最有效的方法的建议,或者对我接近绘图的方式的任何批评。

    最佳答案

    Triangulate一切并将三角形折腾成一个大 VA/VBO .

    编辑 :GLUTesselator包装器:

    struct TessContext
    {
    ~TessContext()
    {
    for( size_t i = 0; i < combined.size(); ++i )
    {
    delete[] combined[i];
    }
    }

    vector< Eigen::Vector2d > pts;
    vector< GLdouble* > combined;
    };

    #define APIENTRY __stdcall

    void APIENTRY tess_begin( GLenum type ) {}
    void APIENTRY tess_edgeFlag( GLboolean flag ) {}
    void APIENTRY tess_end() {}

    void APIENTRY tess_vertex( void *data, TessContext* ctx )
    {
    GLdouble* coord = (GLdouble*)data;
    ctx->pts.push_back( Eigen::Vector2d( coord[0], coord[1] ) );
    }

    void APIENTRY tess_combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData, TessContext* ctx )
    {
    GLdouble* newVert = new GLdouble[3];
    ctx->combined.push_back( newVert );

    newVert[0] = coords[0];
    newVert[1] = coords[1];
    newVert[2] = coords[2];
    *outData = newVert;
    }

    template< typename Vec >
    vector< Vec > Triangulate
    (
    const vector< Vec >& aSimplePolygon
    )
    {
    vector< GLdouble > coords;
    for( size_t i = 0; i < aSimplePolygon.size(); ++i )
    {
    coords.push_back( aSimplePolygon[i].x() );
    coords.push_back( aSimplePolygon[i].y() );
    coords.push_back( 0 );
    }

    GLUtesselator* tess = gluNewTess();
    //gluTessProperty( tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD );
    //gluTessProperty( tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO );

    gluTessCallback( tess, GLU_TESS_BEGIN, (GLvoid (APIENTRY *)()) tess_begin );
    gluTessCallback( tess, GLU_TESS_EDGE_FLAG, (GLvoid (APIENTRY *)()) tess_edgeFlag );
    gluTessCallback( tess, GLU_TESS_VERTEX_DATA, (GLvoid (APIENTRY *)()) tess_vertex );
    gluTessCallback( tess, GLU_TESS_END, (GLvoid (APIENTRY *)()) tess_end );
    gluTessCallback( tess, GLU_TESS_COMBINE_DATA, (GLvoid (APIENTRY *)()) tess_combine );
    gluTessNormal( tess, 0.0, 0.0, 1.0 );

    TessContext ctx;

    gluTessBeginPolygon( tess, &ctx );
    gluTessBeginContour( tess );

    for( size_t i = 0; i < aSimplePolygon.size(); ++i )
    {
    gluTessVertex( tess, &coords[i*3], &coords[i*3] );
    }

    gluTessEndContour( tess );
    gluTessEndPolygon( tess );

    gluDeleteTess(tess);

    vector< Vec > ret( ctx.pts.size() );
    for( size_t i = 0; i < ret.size(); ++i )
    {
    ret[i].x() = ctx.pts[i].x();
    ret[i].y() = ctx.pts[i].y();
    }

    return ret;
    }

    用途 Eigen但不是为了任何有趣的事情。

    关于opengl - 使用 OpenGL 有效地绘制大量多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828996/

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