OpenGL在VBO中分离多边形

时间:2014-11-15 10:42:49

标签: opengl vbo

我正在尝试使用一个VBO来绘制彼此分开的多边形。当我绘制多边形时,OpenGL无法知道从哪里开始新的多边形并绘制多边形联合。

我如何在VBO(或IBO)上设置一个断点来告诉OpenGL启动一个新的多边形。

对不起,这似乎是一个新手问题,我搜索了问题和教程,但找不到答案。

感谢您的评论:)

我正在尝试创建一个dxf查看器。 Dxf文件的多边形具有实心阴影,因此我认为使用GL_POLYON而不是曲面细分会更快(我可能在这里错了)。

我的绘图函数查看每个对象并对文件中的每个基元进行绘图调用。看起来这种方法很慢。所以我决定为每个uniqe类型使用一个顶点数组和一个缓冲区。

对于行,不需要知道结尾,因为每行必须有2个顶点。但是多边形可能有不同数量的顶点,我应该告诉opengl新多边形的开始位置。

void draw_scene(/*function variables*/){
    Shader::shader_use();

    glEnableClientState(GL_VERTEX_ARRAY);
    unsigned long int i;
    unsigned long int count = objects.size();
    for(i = 0; i < objects.size(); i++){
        glBindVertexArray(objects[i]->vao);
        glDrawArrays(objects[i]->primitive_type, 0, objects[i]->vertice_count);
        glBindVertexArray(0);
    }
    glDisableClientState(GL_VERTEX_ARRAY);
    Shader::shader_close();
}

上述代码尚未优化。我想在一次调用中绘制具有相同基本类型的对象。认为如果可以将它们放在一个顶点缓冲区中,那么我就可以在一次调用中绘制它们。因此每种类型(点,线等)都会有一个VAO。

事实上,我不知道是否有更好的解决方案。因为即使我可以将它们放在一个缓冲区中,也很难修改原始顶点,因为它们都被放在一个数组中。修改一个顶点将导致重新读取所有相同类型的顶点。

我还搜索了一次绑定多个vao,以免制作过多的绘制调用。但我找不到方法。

非常感谢你的帮助:))

1 个答案:

答案 0 :(得分:4)

评论中已经涵盖了部分内容。

替换GL_POLYGON

不推荐使用GL_POLYGON基元类型,但OpenGL核心配置文件中不提供该类型。幸运的是,它很容易被GL_TRIANGLE_FAN取代。 GL_TRIANGLE_FAN使用相同的顶点顺序,因此您可以直接将GL_POLYGON替换为GL_TRIANGLE_FAN,而无需更改任何其他内容。

只能使用GL_TRIANGLE_FAN直接绘制凸多边形,而无需使用更精细的三角剖分。但GL_POLYGON也是如此,所以这不是一个新限制。

使用单次绘制调用绘制多个多边形

有几种方法:

  1. 您可以使用glMultiDrawArrays()。其中glDrawArrays()采用一个起始索引和一个大小,glMultiDrawArrays()采用每个索引的数组。因此,它可用于通过一次调用替换任意数量的glDrawArrays()次呼叫。

  2. 您可以使用原始重启。这样做的缺点是你需要一个索引数组,否则可能没有必要。除此之外,它很简单。您可以使用以下命令启用它:

    glPrimitiveRestartIndex(0xffff);
    glEnable(GL_PRIMITIVE_RESTART);
    

    您可以使用任何索引作为重启索引,但使用最大可能索引是常见策略,如果使用类型为0xffff的索引,则为GL_UNSIGNED_SHORT。如果您至少使用OpenGL 4.3或OpenGL ES 3.0,您也可以用以下内容替换上面的内容:

    glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
    

    然后设置一个索引数组,在每个要启动新多边形的位置插入0xffff值,并照常绑定索引数组。然后,您可以通过一次glDrawElements()调用绘制所有多边形。