体素中的 OpenGL 3D 透明度

Posted

技术标签:

【中文标题】体素中的 OpenGL 3D 透明度【英文标题】:OpenGL 3D transparency in voxels 【发布时间】:2014-01-14 13:58:33 【问题描述】:

(抱歉,我不在电脑前,所以无法提供代码) 我有一个基于体素的游戏,我想添加透明纹理,即玻璃。我意识到透明纹理会丢掉一些东西(通过其他块查看),所以我使用我的着色器删除了任何低于玻璃纹理的 alpha 值的 alpha 分量。目前,玻璃的 alpha 为 0.26(坐标范围为 0 - 1),并且工作正常。但是,如果我想为玻璃添加一些透明度而不是删除所有透明度,我遇到了我的老问题,您可以透过玻璃后面的块看到。

我在几个地方读到了我需要从前到后对几何图形进行排序。即使在使用着色器之后,这仍然与我的情况有关吗?我使用显示列表,对于我的世界中的每个块,我是否应该保留两个列表,一个用于不透明块,一个用于透明?所以当我渲染时,我会做一次渲染不透明列表,然后再做一次渲染,反向渲染块并渲染透明列表?

或者有更好的方法吗?

【问题讨论】:

【参考方案1】:

透过透明几何体后面的方块意味着您仍然启用了深度检查,这意味着玻璃后面的方块没有被渲染。

我在几个地方读到了我需要从中排序几何的地方 从前到后。即使在之后这仍然与我的情况有关吗 使用着色器?

是的你仍然需要排序,几何着色器不能解决这个问题

但是,当您在不透明几何体之后渲染透明几何体时(打开 Alpha 混合后),您只需要对透明几何体进行排序

【讨论】:

我就是这么想的。因此,为了澄清起见,在渲染透明纹理时,我必须从后到前逐字渲染我的块?当我这样做时,我需要关闭深度蒙版,然后再启用它?还有什么我需要做的吗? 另外,我是否也需要对一个块中的单个体素进行实际排序?那么,我将块中的体素从前到后排序,然后将世界中的块从前到后排序? 你需要对所有基元进行排序,否则你会得到奇怪的混合,但只有当它们在视图中重叠时才重要,如果一个块在左边,另一个在右边,那么没关系哪个块首先呈现 是的,但是我是否将它们从前到后正确排序并不重要?我需要对单个体素进行排序吗? 透明pass时只需要关闭深度写入(glDepthMask(false);)

以上是关于体素中的 OpenGL 3D 透明度的主要内容,如果未能解决你的问题,请参考以下文章

【PCL】VoxelGrid体素化网格滤波器

在 OpenGL 中渲染透明块

OpenGL 透明效果在 Meego 上显示得非常糟糕

Android openGL ES 2.0里Surfaceview背景透明

VoxelGrid体素滤波器对点云进行下采样

精灵用黑色代替透明度