我正在尝试使用一个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,以免制作过多的绘制调用。但我找不到方法。
非常感谢你的帮助:))
答案 0 :(得分:4)
评论中已经涵盖了部分内容。
GL_POLYGON
不推荐使用GL_POLYGON
基元类型,但OpenGL核心配置文件中不提供该类型。幸运的是,它很容易被GL_TRIANGLE_FAN
取代。 GL_TRIANGLE_FAN
使用相同的顶点顺序,因此您可以直接将GL_POLYGON
替换为GL_TRIANGLE_FAN
,而无需更改任何其他内容。
只能使用GL_TRIANGLE_FAN
直接绘制凸多边形,而无需使用更精细的三角剖分。但GL_POLYGON
也是如此,所以这不是一个新限制。
有几种方法:
您可以使用glMultiDrawArrays()
。其中glDrawArrays()
采用一个起始索引和一个大小,glMultiDrawArrays()
采用每个索引的数组。因此,它可用于通过一次调用替换任意数量的glDrawArrays()
次呼叫。
您可以使用原始重启。这样做的缺点是你需要一个索引数组,否则可能没有必要。除此之外,它很简单。您可以使用以下命令启用它:
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()
调用绘制所有多边形。