我前段时间通过跟踪像素教程实现了天空颜色的模拟: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()));
要点:
问题是,我发现前后天空颜色没有区别 添加臭氧。有人可以指导我做错了什么吗?