我开始学习openGL (使用3.3版本),目的是创建一个小的3d落沙模拟,类似于:
https://www.youtube.com/watch?v=R3Ji8J2Kprw&t=41s
我有一些设置体素环境的经验,比如Unity的一些Udemy教程中的Minecraft,但我想从头开始构建一些简单的东西,而不是使用Unity处理所有已经铺设在上面的系统。
我遇到的第一个问题出现得很早。我想构建一个渲染四边形的系统,因为实例化大量立方体的效率低得离谱。我还想高效地存储顶点、颜色等。到目前为止,在opengl教程中,我使用的方法是将每个顶点存储在一个具有位置和颜色数据的浮点数组中,并使用glVertexAttribPointer将buffer对象设置为读取每组六个条目的三个浮点数和三个颜色。问题是,对于每个相邻的四边形,相同的顶点将被重复,因为如果它们是由不同的“块”组成的,它们将是不同的颜色,我想避免这种情况。
相反,我想做的是将一个立方体的顶点存储在一个整数数组中(位置都是整数),然后将地形之外的每个四边形添加到一个索引数组中(这可能会变成每个块的网格)。索引数组将存储每个四边形的位置,另一个单独的数组将存储每个四边形的颜色。我对如何设置有点困惑,因为我是opengl的新手,但我知道这应该是可行的,基于其他人对我的世界克隆所做的事情,如果不是更容易,因为我不需要纹理。
我只是真的想让框架的块,块,世界等,启动和运行,这样我就可以得到有趣的东西,如添加新的元素。任何人能够验证这是一个明智的方式来做这件事(lol),并提供如何在渲染中设置的指导,我将非常感激。
发布于 2021-11-29 00:18:23
到目前为止,在opengl教程中,我使用的方法是使用glVertexAttribPointer将每个顶点存储在一个具有位置和颜色数据的浮动数组中,并设置buffer对象以读取每组六个条目的三个浮点数和三个颜色浮点数。问题是,对于每个相邻的四边形,相同的顶点将被重复,因为如果它们是由不同的“块”组成的,它们将是不同的颜色,我想避免这种情况。
是的,也许这是有原因的。你似乎是在试着拯救..。什么,几个字节的RAM?你的显卡上有8 8GB的RAM,它没有的是一个通用的处理单元或一个无限的总线,以便在其他缓冲区中为每个渲染的像素进行随机查找。
索引数组将存储每个四边形的位置,另一个单独的数组将存储每个四边形的颜色。
如果你坚持这样做,没有什么能阻止你。您甚至不需要四边形顶点,可以在几何体着色器中合成它们。
只需像你已经知道的那样用X|Y|Width|Height|Color(RGB)填充glVertexAttribPointer缓冲区,然后运行几何着色器为输入缓冲区中的每个条目合成两个三角形(四边形),然后顶点着色器将其投影到世界单位(您提到的是整数,所以最初不是世界单位),然后片段着色器可以根据每个栅格像素的颜色条目为其着色。
效率低得离谱
事实上,如果你觉得这听起来效率低得离谱,那是因为它确实如此。你本质上是在CPU上打包数据,将其传输到GPU,解包,然后像往常一样处理它。至少可以跳过两个步骤,如果考虑到顶点着色器输出缓存在光栅化的基本体中,则可以跳过更多步骤。
这种疯狂还有更多的变体,比如:
https://stackoverflow.com/questions/70148352
复制相似问题