【问题标题】:What's the best way to draw multiple objects in modern OpenGL?在现代 OpenGL 中绘制多个对象的最佳方法是什么?
【发布时间】:2015-12-30 15:21:34
【问题描述】:

我正在尝试使用现代 OpenGL 和着色器,而不是我目前使用的即时模式。我最近了解了 VBO 和 VAO,我仍在努力了解它们,但我知道 VBO 需要一组作为顶点的浮点数,然后将其传递给 GPU 等

使用 VBO 在不同位置绘制多个对象(它们都是相同的)的最佳方法是什么?是不是得先画一个,然后修改事先传入的数组,然后再画一遍,修改,再画,再修改等等……每帧画面中的所有块?还是有更好的办法?

我正在努力实现这一目标:http://imgur.com/cBgJ0sK

感谢任何帮助 - 我不想学习坏的(已弃用的、旧的)即时模式习惯,因为我可以学习更现代的方式!

【问题讨论】:

  • 如果你刚刚开始,坚持基本的绘制命令;使用顶点缓冲区,它们对于简单的 2D 场景来说已经足够快了。从技术上讲,实例化渲染可能更有效,但请确保您在了解更高级的内容之前了解基础知识。
  • 你的意思是尝试绘制那张图片中的内容是高级的开始,还是你的意思是我应该每帧更新 VBO(因为它更对我正在做的事情来说不够快)?
  • 我建议您从使用一个静态 VBO 开始,并使用着色器统一将每个四边形移动到其位置。大多数(核心)OpenGL 教程都应该教这个。
  • 非常感谢。第一次在 Stack Overflow 我很高兴/印象深刻!
  • 我发现这是对 opengl 实例化的一个很好的介绍:learnopengl.com/#!Advanced-OpenGL/Instancing

标签: c++ opengl


【解决方案1】:

您不应该修改程序中的顶点,这应该在着色器中完成。为此,您将创建一个表示转换的矩阵,并将在顶点着色器中使用该矩阵。

主要思想是:

您创建一个 VAO 来保存 VBO 的信息(顶点、法线、纹理坐标、切线信息等)

然后,对于每个不同的对象,您生成一个模型矩阵,其中包含位置、方向和比例(以及其他同质变换)的信息,并将其发送到您的着色器以进行变换。

这个想法是您只需绑定一次 VAO,然后绘制所有不同的对象,只需发送更改的信息(模型矩阵,可能是纹理)并绘制对象。

要了解如何使用模型矩阵,请阅读以下教程: http://ogldev.atspace.co.uk/www/tutorial06/tutorial06.html

还有更好的方法可以做到这一点,但您可以从这里开始。

其他对您的案例有益的信息是使用实例化。 http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html

稍后,您可以继续使用间接绘图以获得更好的性能。以后……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多