OpenGL渲染多个网格实例

OpenGL渲染多个网格实例,opengl,Opengl,我开始学习OpenGL,现在我要试着自己开发一些东西,但我有一个疑问 我将渲染具有大约50k个基本体(圆柱体、立方体、圆锥体等)的模型。不到1/4的是“独特的”,我的意思是,有相同的尺寸,但不同的定位和旋转。所以我认为我可以用基本顶点填充数据缓冲区,然后用单独的变换矩阵绘制它们 根据我所读的,我应该使用顶点缓冲区和索引缓冲区,这样我就不会浪费内存存储重复的顶点 所有这些数据都存储在一个大的缓冲区中(这是因为我读到,如果一个缓冲区不超过1~3mb的限制,那么这会更有效) 为了绘制它们,我尝试使用g

我开始学习OpenGL,现在我要试着自己开发一些东西,但我有一个疑问

我将渲染具有大约50k个基本体(圆柱体、立方体、圆锥体等)的模型。不到1/4的是“独特的”,我的意思是,有相同的尺寸,但不同的定位和旋转。所以我认为我可以用基本顶点填充数据缓冲区,然后用单独的变换矩阵绘制它们

根据我所读的,我应该使用顶点缓冲区和索引缓冲区,这样我就不会浪费内存存储重复的顶点

所有这些数据都存储在一个大的缓冲区中(这是因为我读到,如果一个缓冲区不超过1~3mb的限制,那么这会更有效)

为了绘制它们,我尝试使用gldrawerelements,但是由于它们都在一个缓冲区中,所以我无法更新单个矩阵来更新着色器,以便它们可以在正确的位置绘制每个网格

一种解决方案是使用数千个小缓冲区,然后更新glpaurements调用之间的矩阵

另一种方法是丢弃索引缓冲区,只存储顶点,这样我就可以使用glDrawArrays绘制它们,这样我就可以只绘制缓冲区的一小部分


我上面说的一切都是错的吗?哪种选择会带来更好的性能?有更好的方法吗?

看起来像是你想要的。您可以通过各种方式传递每实例转换矩阵(以及任何其他每实例数据),请参见链接。@peppe谢谢,这正是我需要的。在开始编写代码之前,我们将对此进行研究。如果您希望将其作为答案发布,以便我可以接受。在这种情况下,实例化肯定会很有用。但是在你的帖子中,有一些关于基本知识的澄清。仅仅因为所有内容都在一个缓冲区中,并不意味着您必须在一个draw调用中绘制所有内容。
gl抽屉元素()
的最后一个参数是偏移量。因此,您可以绘制部分索引,更改状态,绘制另一部分,等等,同时仍将所有索引和顶点放在一个缓冲区中。您可以通过各种方式传递每实例转换矩阵(以及任何其他每实例数据),请参见链接。@peppe谢谢,这正是我需要的。在开始编写代码之前,我们将对此进行研究。如果您希望将其作为答案发布,以便我可以接受。在这种情况下,实例化肯定会很有用。但是在你的帖子中,有一些关于基本知识的澄清。仅仅因为所有内容都在一个缓冲区中,并不意味着您必须在一个draw调用中绘制所有内容。
gl抽屉元素()
的最后一个参数是偏移量。因此,您可以绘制部分索引,更改状态,绘制另一部分,等等,同时仍将所有索引和顶点放在一个缓冲区中。您可以通过各种方式传递每实例转换矩阵(以及任何其他每实例数据),请参见链接。@peppe谢谢,这正是我需要的。在开始编写代码之前,我们将对此进行研究。如果您希望将其作为答案发布,以便我可以接受。在这种情况下,实例化肯定会很有用。但是在你的帖子中,有一些关于基本知识的澄清。仅仅因为所有内容都在一个缓冲区中,并不意味着您必须在一个draw调用中绘制所有内容。
gl抽屉元素()
的最后一个参数是偏移量。因此,您可以绘制部分索引、更改状态、绘制另一部分等,同时仍可以在单个缓冲区中保留所有索引和顶点。