我的github

[1]The Basics of GPU Voxelization:https%3A//developer.nvidia.com/content/basics-gpu-voxelization

[2]体素化Voxelization:基于GPU的三维体素化:https%3A//yangwc.com/2019/06/11/Voxelization/

[3]Global Illumination_Voxel Global Illumintaion (VXGI)(体素全局渲染):https%3A//blog.csdn.net/qq_35312463/article/details/121754345

最近研究到全局光照,我决定使用NVIDIA的VXGI方案,VXGI是一个3 Pass的算法,第二个Pass便是将场景体素化,于是我只好做一下模型体素化。考虑到这个体素化需要做到实时计算,我决定借助GPU进行体素化。于是我开始从网上寻找资料,经过辗转找到了NVIDIA的这篇文章[1],通过这篇文章的前半部分我对模型体素化有了大致的思路。但是按照原文的说法,借助光栅化会有一些孔洞,于是我具体实现的方案是参考了这篇文章[2]。

为了体素化场景,得先构建一个场景。

然后开始正式体素化。我认为体素化有两种,一种是仅仅体素化,另一种还需要记录每一个体素的颜色信息。为了方便说明,我们将讲解前者,但是两者的实现没有本质区别,仅仅是储存体素的数据结构可能不太一样:前者我倾向于使用SSBO,后者还是3D纹理更加合适。在开始之前还有最后一件事情,就是确定体素化的分辨率,这个分辨率决定了体素的精度。我采用50x50x50的分辨率,这对于我的场景来说足够了。

开始体素化。首先在CPU端创建一个SSBO缓存对象,并且将它的所有元素初始化为0:

unsigned int length = 50 * 50 * 50;
unsigned int vx_info;
glGenBuffers(1, &vx_info);//先生成一个缓存对象
glBindBuffer(GL_SHADER_STORAGE_BUFFER, vx_info);//将SSBO绑定到缓存对象
glBufferData(GL_SHADER_STORAGE_BUFFER, length * sizeof(int), NULL, GL_STATIC_DRAW);//缓存数据初始化
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_cntBuffer);
void* VoidPtr = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY);
int* MapPtr = reinterpret_cast<int*>(VoidPtr);
for (int i = 0; i < length; i++) MapPtr[i] = 0;
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

参考:https://zhuanlan.zhihu.com/p/593618561?utm_id=0

体素:https://www.cnblogs.com/2008nmj/p/16865219.html

posted on 2023-02-28 14:22  XiaoNiuFeiTian  阅读(234)  评论(0编辑  收藏  举报