我正在尝试使用一个 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 的方法,以免进行过多的绘制调用。但是我找不到方法。
非常感谢您的帮助:)
评论中已经涵盖了其中的一部分。
GL_POLYGON该GL_POLYGON基本类型已被弃用,在OpenGL的核心配置文件不可用。幸运的是,它可以很容易地替换为GL_TRIANGLE_FAN. GL_TRIANGLE_FAN使用相同的顶点顺序,因此您可以直接替换GL_POLYGON为GL_TRIANGLE_FAN,而无需更改任何其他内容。
只有凸多边形可以直接绘制,GL_TRIANGLE_FAN而无需使用任何更复杂的三角剖分。但同样适用于GL_POLYGON,所以这不是一个新的限制。
有几种方法:
您可以使用glMultiDrawArrays(). whereglDrawArrays()取一个起始索引和一个大小,glMultiDrawArrays()取一个数组。因此它可用于glDrawArrays()用单个调用替换任意数量的调用。
您可以使用原始重启。这样做的缺点是您需要一个索引数组,否则可能不需要。除此之外,它很简单。您可以通过以下方式启用它:
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()调用绘制所有多边形。
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |