【发布时间】:2020-02-13 14:40:52
【问题描述】:
我在 C++ 中使用 OpenGL(技术上是 EGL,在 Jetson Nano 上。)
假设我要绘制 N 个四边形。想象一下只是一个彩色矩形列表。框架中可能有几千个这样的矩形。
我想使用两个顶点缓冲区:
- 定义每个四边形的几何形状。
- 定义每个四边形共有的属性。
第一个顶点缓冲区应该定义每个四边形的几何形状。它应该只有 4 个顶点,它的数据只是四边形的角。比如:
0, 0, // top left
1, 0, // top right
0, 1, // bottom left
1, 1, // bottom right
那么第二个顶点缓冲区应该只有所有矩形的 x,y,width,height。
x1, y1, width1, height1, color1,
x2, y2, width2, height2, color2,
x3, y3, width3, height3, color3,
x4, y4, width4, height4, color4,
x5, y5, width5, height5, color5,
x6, y6, width6, height6, color6,
... etc.
问题是我的矩形缓冲区中的每个项目都应该应用于顶点缓冲区中的 4 个顶点。
有没有办法对其进行设置,以便它不断地为每个矩形重复使用相同的 4 个四边形顶点,并一次将相同的矩形属性应用于 4 个顶点?
我想我可以做一些事情,所以我说第一个顶点缓冲区应该每个顶点使用一个元素并环绕,但第二个顶点缓冲区每四个顶点使用一个元素或类似的东西。
如何设置?
我现在做什么:
现在我需要一个顶点缓冲区,它的四边形顶点重复次数与我的实例数一样多。
0, 0, // (1) top left
1, 0, //
0, 1, //
1, 1 //
0, 0, // (2) top left
1, 0, //
0, 1, //
1, 1, //
0, 0, // (3) top left
1, 0, //
0, 1, //
1, 1, //
... etc
我的第二个缓冲区为每个顶点复制其数据:
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x1, y1, width1, height1, color1,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x2, y2, width2, height2, color2,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x3, y3, width3, height3, color3,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x4, y4, width4, height4, color4,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x5, y5, width5, height5, color5,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
x6, y6, width6, height6, color6,
... etc.
这似乎真的效率低下,我只想指定前 4 个顶点一次并让它继续以某种方式重用它们,而不是将这 4 个顶点复制 N 次以获得总共 4*N 个顶点我的第一个缓冲区。我只想为每个四边形指定一次 x,y,width,height,color 属性,总共 N 个顶点,not 为每个整体顶点指定一次,总共 4*N 个顶点.
我该怎么办?
【问题讨论】:
-
相对于以正常方式做事正在解决什么问题?
-
@NicolBolas 正常的方法是什么?我要解决的问题是每帧只更新 N 个顶点,而不是每帧 4*N 个顶点。
-
是的,正常的方法是每帧更新 4*N 个顶点。我不是指你的“x,y,w,h”的东西;我的意思是每个顶点的标准“位置+颜色”。我的问题是为什么你觉得这是错误的?你想通过这种方式而不是预期的方式来解决什么问题?
-
听起来你正在使用或想要使用实例化。在这种情况下,只有四个零或一顶点的第一个顶点缓冲区用于非实例化顶点属性,第二个顶点缓冲区用于实例化顶点属性(通过 glVertexAttribDivisor),按实例推进。为此,您需要一个顶点着色器,它执行
gl_Position = pos * widthAndHeight + xAndY,其中pos是由第一个顶点缓冲区提供的非实例化属性,xAndY和widthAndHeight是由第二个顶点缓冲区提供的实例化属性. -
@NicolBolas 如果我想做十二面体而不是矩形,它会更相关吗? ...如果我绘制的形状中有 100 多个顶点来代替四边形?那么这种技术有意义吗?只是因为四边形是如此简单,以至于您无法接受我这样做的动机吗?在我看来,每帧只上传 N 个顶点比每帧上传 N*M 个顶点更好。我只需要知道技术:如何告诉 OpenGL 缓冲区是如何设置的。
标签: c++ opengl egl nvidia-jetson nvidia-jetson-nano