有没有办法使用 vbo 在 Opengl 中使用单个输入值而不是统一的?

Posted

技术标签:

【中文标题】有没有办法使用 vbo 在 Opengl 中使用单个输入值而不是统一的?【英文标题】:Is there a way to use a single input value in Opengl using vbo and not uniform? 【发布时间】:2015-09-19 10:29:54 【问题描述】:

我不确定我的问题是否足够清楚,所以这里有解释: 我正在使用 opengl 开发体素引擎,它运行良好,但我想通过一些优化对其进行一些改进。我开始将 VBO 用于立方体的顶点,我获得了一些 fps,这很棒。但现在我想对立方体的颜色做同样的事情,但我没有找到让我满意的答案,因为我需要具体细节:

我只使用 3 个浮点数作为颜色,所以即使它有效 glVertexAttribPointer() 似乎也不是一个好方法,因为如果我使用它,我需要对每个立方体使用 108 个浮点数3.

我想绘制很多立方体,所以使用 glUniform3f 也不好,因为要绘制很多立方体,每个立方体发送 3 个浮点数会非常慢。

所以在上下文中我的问题是,有没有办法将值存储在 GPU 的内存中(如 VBO),当我绘制立方体时,我只会告诉着色器这些值在哪里?

感谢阅读,可能正在回答:)

【问题讨论】:

例如,您可以按颜色对立方体进行排序,然后使用制服颜色/纹理。 首先,颜色应该是 3 个字节,而不是 3 个浮点数,这样可以节省 75%。您可以对它们进行排序,但您也可以在颜色表中进行查找,这会将您的数据减少到不同颜色的数量。例如,如果您只指定 256 种颜色,您可以为每个顶点分配一种颜色,只占用 1 个字节,比颜色本身少 3 倍的信息。您还可以使用实例渲染绘制立方体,然后为每个实例提供一种颜色,或者更好的是,为每个实例提供一个颜色索引。这些都是可能的选择,问题是:你对OpenGL了解多少?颜色会改变吗? 按颜色排序立方体是个好主意,我没想过,所以谢谢:)。 每个立方体使用 108 个值意味着您使用 36 个顶点。你不应该。您最多应该使用 24 个和索引。对于您的真正问题:使用实例渲染,并且每个立方体只存储一个颜色值。 我也使用浮点数,因为对于 glsl,颜色由 0.0 和 1.0 之间的 3 个值定义,所以使用 3 个字节而不是 3 个浮点数意味着我需要 x/255。每个顶点 3 次因此我不确定是否会提高性能。关于我对 Opengl 的了解,我知道如何绘制东西,但我不知道很多高级功能。某些立方体的颜色可能会改变,但不会经常改变(可能最多 10 秒一次)。我怎样才能将 36 个顶点减少到 24 个? 【参考方案1】:
glVertexAttribDivisor(attribute, 1)

告诉 OpenGL #attribute 每个图元有一个值,而不是每个顶点。如果将数字从 1 增加到 N,则每 N 个基元可以有 1 个值。用于指定颜色(或其他任何内容)一次而不是重复。

glDrawArraysInstanced/glDrawElementsInstanced 也可能有用。这两个都绘制​​了一组点/线/三角形 N 次,并且在您的着色器中,您可以使用 gl_InstanceID 作为整数来计算立方体/无论#0、#1、...

希望对你有帮助

【讨论】:

如果我理解得很好,这可能是最好的选择。我只是不确定我必须如何使用它,我的意思是什么是属性?和其他opengl函数一样,我认为我必须绑定一个对象,但是哪个?使用哪个 glBind ? 好吧,如果你不明白属性是什么,给自己买一本 OpenGL SuperBible 并开始阅读吧!如果您不了解底层系统的工作原理,那么尝试优化任何程序都是没有意义的 我读了一篇关于 Opengl 3.3 的教程,但它真的不完整我的意思是作者解释了如何从 Opengl 开始,但仅此而已。所以即使只有基础知识,我知道属性是 Opengl 对象的索引,但我不明白的是我必须在这里发送他的索引什么对象?我自然会说我必须发送颜色的 vbo 的索引,但我不确定,对吗? 哦,不,我误会了,索引是着色器中输入的位置,例如 in vec3 in_vertex 所以要使用 glVertexAttribDivisor() 我需要写类似:glBindBuffer(GL_ARRAY_BUFFER, colorVBO); glVertexAttribDivisor(1, 1); 如果颜色是第二个输入。

以上是关于有没有办法使用 vbo 在 Opengl 中使用单个输入值而不是统一的?的主要内容,如果未能解决你的问题,请参考以下文章

Android OpenGL 1.1 FBO 和 VBO 支持

未能在 OpenGL/Android 中使用 VBO

OpenGL - 尝试使用 VBO 会导致错误

OpenGL:用 VBO 画线

OpenGL 不使用 VBO 显示三角形

iOS 上的 OpenGL ES 多个没有索引的 VBO