在我的天空模拟中加入臭氧

时间:2018-03-07 13:49:09

标签: c++ atmosphere

我前段时间通过跟踪像素教程实现了天空颜色的模拟:https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/simulating-sky

我根据实际的太阳位置进行了调整,并且能够在白天获得逼真的天空颜色。然而,我注意到在日落之后/日出之前,当它们应该是深蓝色时,颜色是灰色的。在研究了这个之后,我读到这是因为我的模型中没有臭氧吸收。

我使用了消光系数:(3.426,8.298,0.356)* 0.06e-5 - >在https://media.contentapi.ea.com/content/dam/eacom/frostbite/files/s2016-pbs-frostbite-sky-clouds-new.pdf

上找到

并且还读到,由于臭氧不会散射,因此只应将其添加到透射率值中。 Equation

因此,我修改了刮擦像素的代码如下:

    for (uint32_t i = 0; i < numSamples; ++i) {
        vec3 samplePosition = ray_in2.origin() + (tCurrent + 
        segmentLength * 0.5f) * ray_in2.direction();
        float height = samplePosition.length() - atmosphere.earthRadius;

        // compute optical depth for light
        float hr = exp(-height / atmosphere.Hr) * segmentLength;
        float hm = exp(-height / atmosphere.Hm) * segmentLength;
        float ho = exp(-height / atmosphere.Hr)* segmentLength*(6e-7);
        opticalDepthR += hr;
        opticalDepthM += hm;
        opticalDepthO += ho;

        // light optical depth
        float t0Light, t1Light;

            ...
        for (j = 0; j < numSamplesLight; ++j) {
            vec3 samplePositionLight = samplePosition + (tCurrentLight + 
            segmentLengthLight * 0.5f) * sunDir;
            float heightLight = samplePositionLight.length() - 
            atmosphere.earthRadius;

            if (heightLight < 0) break;
            opticalDepthLightR += exp(-heightLight / atmosphere.Hr) * 
            segmentLengthLight;
            opticalDepthLightM += exp(-heightLight / atmosphere.Hm) * 
            segmentLengthLight;
            opticalDepthLightO += exp(-heightLight / atmosphere.Hr) * 
            segmentLengthLight*(6e-7); ;
            tCurrentLight += segmentLengthLight;
        }
        if (j == numSamplesLight) {
            vec3 tau = (betaR) * (opticalDepthR + opticalDepthLightR) + 
           betaM * 1.1f * (opticalDepthM + opticalDepthLightM)+ betaO*
          (opticalDepthO + opticalDepthLightO);
            vec3 attenuation(exp(-tau.x()), exp(-tau.y()), exp(-
            tau.z()));

要点:

  • 我添加了变量opticalDepthO和opticalDepthLightO 计算与瑞利的光学深度相同,但相乘 由6e-7。
  • 然后,将opticalDepthLightO和opticalDepthO的总和乘以臭氧的绝对系数,并加到变量tau。

问题是,我发现前后天空颜色没有区别 添加臭氧。有人可以指导我做错了什么吗?

0 个答案:

没有答案