【Unity】RayMarching体积云理论学习

RayMarching 体积云

  1. RayMarching 是一种处理体积物体的方法
  2. RayMarching 体积云的制作是基于屏幕后处理

  1. 屏幕空间重建世界坐标
    • 目的是把屏幕坐标的每一个像素点转化成Unity世界坐标,可以得到射线的方向

  1. 如何在需要渲染的物体或者场景中使用RayMarching?
    • 使用包围盒
      常见的包围盒算法
      • Axis-Aligned bounding Box 轴对齐包围盒
      • OBB(OrientedboundingBox) 方向包围盒
      • nvdia 改进后的算法
      • 简述AABB和OBB的区别
      • 碰撞检测之 AABB 包围盒
    • 使用包围盒的目的
      • 判断 光线 与复杂的物体相交是一个比较费时的计算,当我们用一个包围盒取包围它时,盒子的计算就会降低很多时间
      • 同时还可以处理不同深度物体的遮挡问题(透明物体?)
      • 碰撞算法会返回 相机到容器的距离返回光线是否在容器中
        • 此时我们就可以获得基础的步长,每次步进都是密度叠加。

  1. 噪声采样
    • Perline噪声:雾状层云,但它无法描述积云中的圆形、波浪状,也无法给它们一种隐隐的运动感
    • Worley噪声:用于渲染焦散和水的效果
    • 3D 纹理 - Unity 手册

    • 3D纹理的采样坐标的原点一般是左下后方
    • 入门图形学:Texture3D-CSDN博客

    • 3D贴图采样贴图传入的是Ray 接触点,但其是世界坐标,需要转换到包围盒的相对位置上去

4,步进
简而言之就是在接触点不断往前,采样密度叠加,直到脱离包围盒或者超出最大步长距离
float  sumDensity  = 0;
 for (int j = 0; j <32; j++)
  {
    if (_dstTravelled < dstLimit)
       {
          rayPos = entryPoint + (worldViewDir * _dstTravelled);
          sumDensity += pow(sampleDensity(rayPos),5);
       }
 _dstTravelled += _rayStep; //向前步进
}
return col + sumDensity ;


5.体积云的光照计算
6.体积云形状控制与动画
  • 可以参考 GPU Pro 7里面的理论

8. 优化方案
  • 分帧渲染
    • 低分辨率上做raymarch计算,然后通过多帧来重建。

参考链接:

RayMarching实时体积云渲染入门(上) - 知乎 (zhihu.com)

A Ray-Box Intersection Algorithm and Efficient Dynamic Voxel Rendering (JCGT)

Ray Marching for Dummies

GPU Pro 7——实时体积云(翻译,附Unity工程)-CSDN博客

Unity 官方

你可能感兴趣的:(Unity3D开发日常,unity,学习,游戏引擎,图形渲染)