AI笔记之4——NeRF的渲染

NeRF的核心思想是将场景中每个3D点的辐射场表示为函数,该函数输入为3D点的位置,输出为辐射场的辐射强度和密度。渲染过程即通过对这个辐射场函数进行采样,来生成图像。

NeRF的渲染过程主要分为两个步骤:采样和渲染。

  1. 采样:在图像平面上均匀采样一组光线,然后通过相机参数将这些光线方向转换到3D场景中。对于每条光线,通过插值等方法确定它与场景表面的交点,并计算该点的辐射强度和密度。

  2. 渲染:对于每个采样点,根据其辐射强度和密度,利用体积渲染技术计算其颜色。最终,将所有采样点的颜色进行累加,得到最终的图像。

    下面是简单的渲染函数示例:


    # 渲染函数 def render_nerf(rays, near, far, model): rays_o, rays_d = rays[..., :3], rays[..., 3:] # 将光线方向单位化 rays_d = F.normalize(rays_d, dim=-1) # 在光线方向上均匀采样点 z_vals = torch.linspace(near, far, steps=num_samples) z_vals = z_vals.expand(rays.shape[0], num_samples) pts = rays_o[..., None, :] + rays_d[..., None, :] * z_vals[..., :, None] # 对每个采样点计算辐射强度和密度 radiance, density = model(pts) # 计算颜色 weights = density * (1. - torch.exp(-radiance * step_size)) color = torch.sum(weights * radiance, dim=-2) # 求和以获得最终颜色 color = torch.sum(color, dim=-1) return color

    NeRF更完。后面是Diffusion了








评论