2
大气伪影对大气的散射
我正在实现行星从太空的大气散射。我一直使用http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html中的Sean O'Neil的着色器作为起点。 除了SkyFromSpace着色器与GroundFromSpace着色器不同之外,我与fCameraAngle有几乎相同的问题,如下所示:http ://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/ 当不在fCameraAngle = 1内部循环中使用时,我从太空着色器中获得了天空的奇异伪像。这些伪影的原因是什么?当fCameraAngle限制为1时,伪像消失。我似乎也缺少O'Neil沙箱(http://sponeil.net/downloads.htm)中的色相。 相机位置X = 0,Y = 0,Z = 500。左侧为GroundFromSpace,右侧为SkyFromSpace。 相机位置X = 500,Y = 500,Z = 500。左侧为GroundFromSpace,右侧为SkyFromSpace。 我发现,根据来源,相机角度似乎处理起来非常不同: 在原始着色器中,SkyFromSpaceShader中的摄影机角度计算为: float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight; 而在空间着色器的地面中,摄影机角度的计算公式为: float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos); 但是,在线上的各种消息来源都在修补射线。为什么是这样? 这是一个C#Windows.Forms项目,该项目演示了该问题,并且我已使用该项目来生成图像:https : //github.com/ollipekka/AtmosphericScatteringTest/ 更新:我从O'Neil站点上的ScatterCPU项目中发现,当摄影机位于阴影点上方时,摄影机射线被否定,以便计算从点到摄影机的散射。 更改射线方向的确确实消除了伪影,但引入了其他问题,如下所示: 此外,在ScatterCPU项目中,O'Neil可以防止光线的光学深度小于零的情况: float fLightDepth = Scale(fLightAngle, fScaleDepth); …