Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 对于具有不同变换的批处理图形对象,最佳做法是什么?_Opengl_Graphics_3d_Opengl Es 2.0 - Fatal编程技术网

Opengl 对于具有不同变换的批处理图形对象,最佳做法是什么?

Opengl 对于具有不同变换的批处理图形对象,最佳做法是什么?,opengl,graphics,3d,opengl-es-2.0,Opengl,Graphics,3d,Opengl Es 2.0,我正在概念化一种很好的方法,在OpenGL中通过一次绘制调用渲染尽可能多的脱节几何体,而当每个几何体都有不同的平移和旋转时,我所面对的墙是最好的方法,因为你没有在单个对象绘制之间统一更新模型视图的奢侈。我在这里和其他地方读到了一些其他的问题,似乎人们所指的方向是多种多样的。最好列出实现这一点的主要方法,并尝试找出最常见或推荐的方法。以下是我考虑过的想法: [编辑:删除了对实例的提及,因为它实际上不适用于此处] 在着色器中创建矩阵变换。在这里,我会发送一个平移向量,或者旋转角度或四元数作为属性的一

我正在概念化一种很好的方法,在OpenGL中通过一次绘制调用渲染尽可能多的脱节几何体,而当每个几何体都有不同的平移和旋转时,我所面对的墙是最好的方法,因为你没有在单个对象绘制之间统一更新模型视图的奢侈。我在这里和其他地方读到了一些其他的问题,似乎人们所指的方向是多种多样的。最好列出实现这一点的主要方法,并尝试找出最常见或推荐的方法。以下是我考虑过的想法:

[编辑:删除了对实例的提及,因为它实际上不适用于此处]

  • 在着色器中创建矩阵变换。在这里,我会发送一个平移向量,或者旋转角度或四元数作为属性的一部分。其优点是它可以跨平台工作,包括移动设备。但对于对象中的每个顶点,将完全相同的变换数据作为属性发送似乎有点浪费。如果没有实例化,我必须在VBO中多次重复单个对象的相同向量或标量,作为交错数组的一部分,对吗?另一个缺点是我依赖着色器来进行计算;我不知道这是否明智

  • 类似于1),但我不是依赖着色器来进行矩阵计算,而是在客户端进行这些计算,但仍然在VBO中以16个浮点流的形式发送最终模型视图矩阵。但据我所知,如果没有实例化,我必须为VBO中的每个顶点重复相同的流,对吗?这似乎是浪费。与上面2)的折衷是,我在每个顶点的VBO中发送更多数据(16个浮点,而不是用于平移的3个浮点向量,可能是4个浮点四元数),但需要着色器做的工作更少

  • 跳过以上所有限制,而是为每个对象分别调用一个绘图。这是我在读的书中典型的“教导”,毫无疑问是为了简单

  • 除了这些,还有其他常用的方法吗

    作为一个学术问题,我很好奇上述所有这些是否都是可行的和“可接受的”,或者其中一个是否显然是胜利者?如果我只使用桌面GL,那么实例是实现这一点的主要方法吗?

    两个注意事项:

    一般来说,如果你有多个对象,每个对象 使用独立变换,可以使用多个绘制调用。那是什么 他们在那里等你。旧的NVIDIA“批量”演示文稿 每帧引用10000到40000个draw调用(在D3D中。更多信息请参见 GL)用于1GHz GPU。如今,你看到的不仅仅是这些。 因此,除非你处理的是成千上万个单独的对象, 所有这些都是不同的(因此没有实例),很有可能 你会没事的

    另一个想法是:

    将modelview矩阵计算完全从着色器中取出,并在乘法后传递顶点。这允许对不同方向和平移的多个对象进行单个绘制调用。所有CPU计算都会带来成本,但我认为如果瓶颈没有多个draw调用的瓶颈那么大,那么它是值得的


    (摘自。)

    这里有另一个想法:


    为每个顶点指定一个通过属性传入的对象ID。然后在顶点着色器中,使用此ID在存储变换矩阵的纹理中进行查找。

    好问题,我很想看到对这些技术的各种优缺点的讨论。这些技术太过硬件专用,无法在如此广泛的硬件平台上给出任何合理或准确的建议。即使只是讨论什么时候适合使用实例也过于硬件特定。你说的基本上是一个为期一个月的评测研究项目。@Nicolas Bolas好吧。。。。因此,假设我们省略了关于实例化的讨论;你是说关于其他技术的讨论没有意义吗?人们用VBO和着色器尝试了各种各样的事情,当然,对于应该注意什么,或者为什么这些建议中的一些根本不好,有一些一般性的想法,等等。@Nicolabolas举例来说,听听关于是否将对象范围内的常量(如modelview)作为顶点属性发送比仅使用单独的绘制调用更好的想法会很有用。@Nicolabolas顺便说一句,您自己对链接到的Meta上的这些问题的解释也有点主观。。在这些问题中考虑这些回答…“如果你讨论的是最佳实践,那么这些问题通常会更容易被接受”和“最佳实践”问题是坏的吗?不是天生的;关于流程的问题往往会经常出现,虽然是的,它们天生是主观的,但只需回答它们就可以了”啊,纹理查找。当然,我喜欢。谢谢。我用过这种方法,有点像精灵。当然,每次都要推动纹理,但它只是一把,比顶点小得多。在我的简化示例中,我只在一行中使用vec4s进行xyz平移和y旋转。纹理中的完整矩阵可能并不总是需要的。