首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分别存储顶点、颜色和索引数据?(OpenGL)

如何分别存储顶点、颜色和索引数据?(OpenGL)
EN

Stack Overflow用户
提问于 2021-11-28 23:27:17
回答 1查看 97关注 0票数 1

我开始学习openGL (使用3.3版本),目的是创建一个小的3d落沙模拟,类似于:

https://www.youtube.com/watch?v=R3Ji8J2Kprw&t=41s

我有一些设置体素环境的经验,比如Unity的一些Udemy教程中的Minecraft,但我想从头开始构建一些简单的东西,而不是使用Unity处理所有已经铺设在上面的系统。

我遇到的第一个问题出现得很早。我想构建一个渲染四边形的系统,因为实例化大量立方体的效率低得离谱。我还想高效地存储顶点、颜色等。到目前为止,在opengl教程中,我使用的方法是将每个顶点存储在一个具有位置和颜色数据的浮点数组中,并使用glVertexAttribPointer将buffer对象设置为读取每组六个条目的三个浮点数和三个颜色。问题是,对于每个相邻的四边形,相同的顶点将被重复,因为如果它们是由不同的“块”组成的,它们将是不同的颜色,我想避免这种情况。

相反,我想做的是将一个立方体的顶点存储在一个整数数组中(位置都是整数),然后将地形之外的每个四边形添加到一个索引数组中(这可能会变成每个块的网格)。索引数组将存储每个四边形的位置,另一个单独的数组将存储每个四边形的颜色。我对如何设置有点困惑,因为我是opengl的新手,但我知道这应该是可行的,基于其他人对我的世界克隆所做的事情,如果不是更容易,因为我不需要纹理。

我只是真的想让框架的块,块,世界等,启动和运行,这样我就可以得到有趣的东西,如添加新的元素。任何人能够验证这是一个明智的方式来做这件事(lol),并提供如何在渲染中设置的指导,我将非常感激。

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 00:18:23

到目前为止,在opengl教程中,我使用的方法是使用glVertexAttribPointer将每个顶点存储在一个具有位置和颜色数据的浮动数组中,并设置buffer对象以读取每组六个条目的三个浮点数和三个颜色浮点数。问题是,对于每个相邻的四边形,相同的顶点将被重复,因为如果它们是由不同的“块”组成的,它们将是不同的颜色,我想避免这种情况。

是的,也许这是有原因的。你似乎是在试着拯救..。什么,几个字节的RAM?你的显卡上有8 8GB的RAM,它没有的是一个通用的处理单元或一个无限的总线,以便在其他缓冲区中为每个渲染的像素进行随机查找。

索引数组将存储每个四边形的位置,另一个单独的数组将存储每个四边形的颜色。

如果你坚持这样做,没有什么能阻止你。您甚至不需要四边形顶点,可以在几何体着色器中合成它们。

只需像你已经知道的那样用X|Y|Width|Height|Color(RGB)填充glVertexAttribPointer缓冲区,然后运行几何着色器为输入缓冲区中的每个条目合成两个三角形(四边形),然后顶点着色器将其投影到世界单位(您提到的是整数,所以最初不是世界单位),然后片段着色器可以根据每个栅格像素的颜色条目为其着色。

效率低得离谱

事实上,如果你觉得这听起来效率低得离谱,那是因为它确实如此。你本质上是在CPU上打包数据,将其传输到GPU,解包,然后像往常一样处理它。至少可以跳过两个步骤,如果考虑到顶点着色器输出缓存在光栅化的基本体中,则可以跳过更多步骤。

这种疯狂还有更多的变体,比如:

  • 按正常方式存储未打包的顶点位置,并存储颜色的索引。然后将颜色存储在某种线性缓冲区(纹理、SSBO、通用缓冲区等)中,并查找每个颜色索引。这效率更低,但它更接近于算法您可以为一个四边形绘制顶点位置,并使用多绘制命令和缓冲区设置实例化渲染,以馈送单独的实例数据(位置和颜色)。如果还具有纹理,则可以对每个四边形实例使用bindless textures。它仍然渲染多个对象,但它稍微优化了您的图形驱动程序。
  • 或只是将每个顶点的数据存储在缓冲区中并渲染它。好了。没有预计算,没有无限的扩展,没有疯狂的代码,你有你的顶点数据并渲染它。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70148352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档