OpenGL 在 VBO 中分离多边形

gok*_*tir 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

非常感谢您的帮助:)

Ret*_*adi 5

评论中已经涵盖了其中的一部分。

更换 GL_POLYGON

GL_POLYGON基本类型已被弃用,在OpenGL的核心配置文件不可用。幸运的是,它可以很容易地替换为GL_TRIANGLE_FAN. GL_TRIANGLE_FAN使用相同的顶点顺序,因此您可以直接替换GL_POLYGONGL_TRIANGLE_FAN,而无需更改任何其他内容。

只有凸多边形可以直接绘制,GL_TRIANGLE_FAN而无需使用任何更复杂的三角剖分。但同样适用于GL_POLYGON,所以这不是一个新的限制。

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

有几种方法:

  1. 您可以使用glMultiDrawArrays(). whereglDrawArrays()取一个起始索引和一个大小,glMultiDrawArrays()取一个数组。因此它可用于glDrawArrays()用单个调用替换任意数量的调用。

  2. 您可以使用原始重启。这样做的缺点是您需要一个索引数组,否则可能不需要。除此之外,它很简单。您可以通过以下方式启用它:

    glPrimitiveRestartIndex(0xffff);
    glEnable(GL_PRIMITIVE_RESTART);
    
    Run Code Online (Sandbox Code Playgroud)

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

    glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
    
    Run Code Online (Sandbox Code Playgroud)

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