Je suis en train d'implémenter la diffusion atmosphérique d'une planète depuis l'espace. J'ai utilisé les shaders de Sean O'Neil de http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html comme point de départ.
J'ai à peu près le même problème lié à fCameraAngle sauf avec le shader SkyFromSpace par opposition au shader GroundFromSpace comme ici: http://www.gamedev.net/topic/621187-sean-oneils-atmospheric-scattering/
Je reçois des artefacts étranges avec le ciel du shader spatial lorsque je ne les utilise pas fCameraAngle = 1
dans la boucle intérieure. Quelle est la cause de ces artefacts? Les artefacts disparaissent lorsque fCameraAngle est limité à 1. Il me semble également ne pas avoir la teinte présente dans le bac à sable d'O'Neil ( http://sponeil.net/downloads.htm )
Position de la caméra X = 0, Y = 0, Z = 500. GroundFromSpace à gauche, SkyFromSpace à droite.
Position de la caméra X = 500, Y = 500, Z = 500. GroundFromSpace à gauche, SkyFromSpace à droite.
J'ai trouvé que l'angle de la caméra semble être géré très différemment selon la source:
Dans les shaders d'origine, l'angle de la caméra dans SkyFromSpaceShader est calculé comme suit:
float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;
Alors que dans le sol depuis l'espace shader, l'angle de la caméra est calculé comme suit:
float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);
Cependant, diverses sources en ligne bricolent avec la négation du rayon. Pourquoi est-ce?
Voici un projet C # Windows.Forms qui illustre le problème et que j'ai utilisé pour générer les images: https://github.com/ollipekka/AtmosphericScatteringTest/
Mise à jour: J'ai découvert grâce au projet ScatterCPU trouvé sur le site d'O'Neil que le rayon de la caméra est annulé lorsque la caméra est au-dessus du point ombré afin que la diffusion soit calculée d'un point à la caméra.
La modification de la direction des rayons supprime en effet les artefacts, mais introduit d'autres problèmes comme illustré ici:
De plus, dans le projet ScatterCPU, O'Neil protège contre les situations où la profondeur optique de la lumière est inférieure à zéro:
float fLightDepth = Scale(fLightAngle, fScaleDepth);
if (fLightDepth < float.Epsilon)
{
continue;
}
Comme souligné dans les commentaires, avec ces nouveaux artefacts, cela laisse toujours la question, qu'est-ce qui ne va pas avec les images où la caméra est positionnée à 500, 500, 500? On dirait que le halo est concentré sur une partie complètement mauvaise de la planète. On pourrait s'attendre à ce que la lumière soit plus proche de l'endroit où le soleil devrait frapper la planète, plutôt que de l'endroit où elle change du jour à la nuit.
Le projet github a été mis à jour pour refléter les changements dans cette mise à jour.