<b>update_density_grid_nerf(alpha, NERF_GRIDSIZE()*NERF_GRIDSIZE()*NERF_GRIDSIZE()*n_cascades, 0, stream);// <i>加入稠密地图点,并更新体素网格的密度值</i>,其中alpha = 0.95f,中间的参数为128*128*128*(m_nerf.max_cascade+1),stream = m_training_stream<br>update_density_grid_nerf(float decay, uint32_t n_uniform_density_grid_samples, uint32_t n_nonuniform_density_grid_samples, cudaStream_t stream),</b>对应起来就是,decay = alpha, n_uniform_density_grid_samples = 128*128*128*(m_nerf.max_cascade+1), n_nonuniform_density_grid_samples = 0, stream = m_training_stream<br>
<b>clear_density_grid_sample_ct_msb();</b>// 用于将体素网格中的占据信息全部置0
<b>update_density_grid_sample_ct_sparse_point_cloud(m_nerf.sparse_map_points_positions.size(),</b>// 应该表示的是所有的点云数<br><b> m_nerf.sparse_map_points_positions_gpu.data(),</b>// 点云的坐标sparse_map_points_positions_gpu就是从slam构造的地图点拷贝到gpu上的<br> m_nerf.density_grid_sample_ct.data());// 根据orb-slam2构建的稀疏点云将<b>density_grid_sample_ct </b>数组中的特定位置的最高有效位设置为1,表示该位置存在点云数据
<b>update_density_grid_sample_ct_sparse_point_cloud();</b>// 这个和上面那个一样,只不过是检测的是参考点云中的体素网格是否被占用(ref_map_points)
最终添加的新的地图点是放在m_nerf.nerf_triangulation_map_points_positions中的,会先判断这里面的大小(因为一开始并没有往里面加点,所以数量应该是0),只要没加到300000个点,就会执行下面的操作(<b>if(m_nerf.nerf_triangulation_map_points_positions.size() < 300000)</b>)
<b>generate_grid_map_points_nerf_nonuniform();</b>// 满足一定条件则对某个体素网格的计数器进行加1操作,并记录这个网格中的所有点云数据<br>其中,<b>m_nerf.density_grid_sample_ct.data()</b>这个数据应该是个多位二进制数,某一位表示的是这个体素位置是否存在点云数据density_grid_sample_ct[idx+grid_mip_offset(mip)] |= 0x80;其他位的数据可能包含着点云的坐标啥的,因为要加以区分,其中某一位应该还包含了体素的权重值,后面判断了权重值和阈值128的大小关系<br><b>out = map_points_positions 只存储了体素网格中大于一定权值的点云,而这个点云在后续会送去构建稠密点云</b>
<b>if (map_points_counter_cpu > 0){m_nerf.nerf_triangulation_map_points_positions.insert(m_nerf.nerf_triangulation_map_points_positions.end(), map_points_positions_cpu.begin(), map_points_positions_cpu.end());}</b>,文中说cnt的值大于一定数时,就把该体素里的所有点拿去构建稠密地图,没想到这个阈值为0.....<br><b>nerf_triangulation_map_points_positions</b>包含了所有的稠密地图点,刚开始应该是什么点都没有的<br>
<b>generate_grid_samples_nerf_nonuniform();</b>// density_grid_positions存储了相对于边界框aabb的新的点云坐标,同时包含了一个进行了归一化或映射操作后的时间步长<br>density_grid_indices存储了key的索引
<br>
<b>generate_grid_samples_nerf_nonuniform();</b>// NERF_MIN_OPTICAL_THICKNESS() = 0.01f,这个函数和上面那个函数实现的作用是一样的,只是输入的采样点数量不一样,上面是均匀采样的数量,这个是非均匀采样的数量;同时用于保存的点云的容器不一样,indices也不一样
<b>m_nerf_network->density(stream, density_grid_position_matrix, density_matrix, false);</b>// <b><i>输入数据进行编码参数训练以及密度网格训练</i></b>
<b>splat_grid_samples_nerf_max_nearest_neighbor(n_density_grid_samples, density_grid_indices, mlp_out, density_grid_tmp, m_nerf.rgb_activation, m_nerf.density_activation);</b>// 处理密度网格样本并计算密度
<b>tomicMax((uint32_t*)&grid_out[local_idx], __float_as_uint(optical_thickness));</b>// 存储这两个当中较大的值
<b>triangualtion_ema_grid_samples_nerf(n_elements, decay, m_nerf.density_grid_ema_step, m_nerf.density_grid.data(), density_grid_tmp, m_nerf.density_grid_sample_ct.data());</b>// 根据重要性度量和衰减因子更新密度网格m_nerf.density_grid.data()的值,其中grid_out = m_nerf.density_grid.data()
<b>float val = (prev_val<0.f) ? prev_val : fmaxf(prev_val * decay, importance);</b>// fmaxf返回较大的那个数<br><b> grid_out[i] = val;</b>
<b>update_density_grid_mean_and_bitfield(stream);</b>// <b> </b>处理密度网格的数据,并最终计算其均值以用于后续处理