在OpenGL中将网格渲染为一系列子组?

在OpenGL中将网格渲染为一系列子组?,opengl,shader,.obj,wavefront,Opengl,Shader,.obj,Wavefront,我正在完成一个波阵面对象解析器,我想用它来构造通用网格对象。我的引擎使用OpenGL 4和着色器绘制引擎中的所有内容 我的问题是如何确保渲染网格的最佳渲染效率 通常,指定了多个对象子组 子组可能被指定一种特定的材料(例如,闪亮的红色) 因此,网格可能是一个相当复杂的子组集合,每个子组都指定了自己的材质 我的问题是—— 问:我是否需要单独绘制每个子组,例如,调用每个子组的GLD元素?(因此,如果我有4个独立的子组,我必须进行4次GLDrainElements调用,从而调用着色器4次,并进行4次均匀

我正在完成一个波阵面对象解析器,我想用它来构造通用网格对象。我的引擎使用OpenGL 4和着色器绘制引擎中的所有内容

我的问题是如何确保渲染网格的最佳渲染效率

通常,指定了多个对象子组

子组可能被指定一种特定的材料(例如,闪亮的红色)

因此,网格可能是一个相当复杂的子组集合,每个子组都指定了自己的材质

我的问题是——

问:我是否需要单独绘制每个子组,例如,调用每个子组的GLD元素?(因此,如果我有4个独立的子组,我必须进行4次GLDrainElements调用,从而调用着色器4次,并进行4次均匀更改(对于材质/纹理))

如果这是正确的,那么我必须计算:

每个子组中的索引(意味着每个子组有一个单独的索引数组和VAO) 子组起点的顶点偏移

这似乎效率极低,我是不是找错人了

此外,从:


有人能建议平滑着色值表示什么吗?例如,s1、s2、s4等。

是的,您应该将每个子组与其他子组分开绘制。这是必需的,直到子组之间的状态不同

但你迈出的步伐太长了

为了避免多次绘制调用,可以引入顶点属性,指示用于访问统一数组值(材质数组、纹理数组)的索引。这样,您只需要一个draw调用,但您将需要一个附加属性及其相关管理的成本

我将避免上述做法。如果一个子组有纹理而另一个子组没有呢?你如何区分是否使用纹理?引入其他属性?看起来很困惑

第一点是缓冲区对象管理非常灵活。实际上,您可以有一个单一元素缓冲区对象和一个单一顶点缓冲区对象:使用偏移和交错,您可以满足每一级的复杂性。然后,在现代硬件上,使用顶点数组对象可以最小化不同缓冲区绑定的成本

第二点是,您的软件可以将具有相同统一状态的不同子组分组,将多个draw调用连接到一个单独的子组中。请记住,您可以使用多个绘制入口点变量,并且还有可以帮助您重新启动的基本体(在剥离基本体的情况下)

其他的考虑是没有用的,因为你无论如何都要画画,不管它是否复杂。依次地,当您获得正确的渲染时,您可以分析应用程序和渲染,从而切断热点


平滑组是共享相同选项属性(法线、纹理坐标)的顶点集合。这是元素索引顶点的情况


要更深入地了解这个问题,请阅读谷歌搜索到的一个问题。

如前所述,如果不了解顶点数据是什么以及您将如何使用它,就无法回答这个问题。材质、着色器等问题都会影响性能。您好,谢谢您的回答,当我获得所需的15个声誉点时,我将投票支持您的回答。
glDrawElements( GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset );
Smooth shading across polygons is enabled by smoothing groups.
 s 1
 ...
  # Smooth shading can be disabled as well.
  s off
  ...