环境光吸收(也叫环境光遮蔽,Ambient Occlusion)

环境光吸收式一种用于产生真实软阴影的技术。常规的阴影实现,是采用发射一条阴影测试光线,测试光线与灯是否有遮挡。而环境光吸收采用向半球面随机发射光线,利用光线与环境的交点个数来模拟阴影的深浅。

其实现的原理如下:

//法线空间
  optix::Onb onb(ffnormal);

  unsigned int seed = rot_seed( rnd_seeds[ launch_index ], frame );

  float       result           = 0.0f;
  const float inv_sqrt_samples = 1.0f / float(sqrt_occlusion_samples);
  //发射sqrt_occulsion_sample*sqrt_occulsion_sample条测试光线
  for( int i=0; i<sqrt_occlusion_samples; ++i ) {
    for( int j=0; j<sqrt_occlusion_samples; ++j ) {

      PerRayData_occlusion prd_occ;
      prd_occ.occlusion = 0.0f;

      // Stratify samples via simple jitterring
      float u1 = (float(i) + rnd( seed ) )*inv_sqrt_samples;
      float u2 = (float(j) + rnd( seed ) )*inv_sqrt_samples;

      //计算发射方向
      float3 dir;
      optix::cosine_sample_hemisphere( u1, u2, dir );
      
      onb.inverse_transform( dir );

      optix::Ray occlusion_ray = optix::make_Ray( phit, dir, 2, scene_epsilon,
                                                  occlusion_distance );
      rtTrace( top_object, occlusion_ray, prd_occ );
      //累加结果
      result += 1.0f-prd_occ.occlusion;
    }
  }

  result /= (float)(sqrt_occlusion_samples*sqrt_occlusion_samples);



利用得到的result,来衰减我们的渲染结果即可。


转载于:https://my.oschina.net/superpdm/blog/286471

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值