我不知道在这里“碰到”一个老问题是否可以,但我想到了一些事情:
如果您的体素是静态的,您可以通过使用八叉树进行平截头体剔除等来加快整个渲染过程。此外,您还可以将静态场景编译成八叉树中的潜在可见性集。PVS 的主要原理是预先计算树中的所有节点,其他节点可能从中可见,并将指向它们的指针存储在向量中。当涉及到渲染时,您首先检查相机放置在哪个节点中,然后对节点的 PVS 向量中的所有节点运行视锥体剔除。(Carmack 在 Quake 引擎中使用了类似的东西,但使用二进制空间分区树)
如果您的体素的着色有点复杂,那么执行预深度仅传递也很快,无需写入颜色缓冲区,只需填充深度缓冲区。之后渲染第二遍:禁用写入深度缓冲区并在检查深度缓冲区时仅渲染到颜色缓冲区。因此,您可以避免昂贵的着色器计算,这些计算随后会被更靠近查看器的新片段覆盖。(卡马克在 Quake3 中使用了它)
肯定会加快速度的另一件事是使用实例化。您只需将每个体素的位置以及必要时的比例和其他参数存储到纹理缓冲区对象中。然后,在顶点着色器中,您可以读取要生成的体素的位置并创建体素的实例(即,在顶点缓冲区对象中提供给着色器的立方体)。因此,您只需将 8 个顶点 + 8 个法线(3 *sizeof(float) *8 +3 *sizeof(float) *8 + 用于颜色/纹理等的浮点数)发送一次到 VBO 中的卡,然后只发送TBO 中 Cube(3*sizeof(float)*number of voxels) 实例的位置。
也许通过在 2 个线程中组合所有 3 个步骤来并行化 GPU 和 CPU 之间的事情是可能的,在 CPU 线程中,您检查八叉树 pvs 并更新 TBO 以在下一帧中进行实例化,GPU 线程同时渲染 2在使用上一步中由 CPU 线程创建的 TBO 进行实例化时通过。之后,您切换 TBO。如果相机没有移动,您甚至不必再次进行 CPU 计算。
我感兴趣的另一种树是所谓的 kd-tree,它比八叉树更通用。
PS:对不起我的英语,这不是最清楚的......