3 votes

Pourquoi mes sphères raytraced ont-elles des lignes sombres lorsqu'elles sont éclairées par plusieurs sources lumineuses ?

J'ai un raytracer simple qui ne fonctionne que jusqu'à la première intersection. La scène semble correcte avec deux sources de lumière différentes, mais lorsque les deux lumières sont dans la scène, il y a des ombres sombres là où la zone éclairée par l'une se termine, même si elle se trouve au milieu d'une zone éclairée par l'autre source de lumière (particulièrement visible sur la boule verte). La transition entre la "zone éclairée par les deux sources lumineuses" et la "zone éclairée par une seule source lumineuse" semble être légèrement plus sombre que la "zone éclairée par une seule source lumineuse".

Hosted by imgur.com

Le code dans lequel j'ajoute les effets de lumière est le suivant :

// trace lights
        for ( int l=0; l<primitives.count; l++) {

            Primitive* p = [primitives objectAtIndex:l];
            if (p.light) 
            {
                Sphere * lightSource = (Sphere *)p;

                // calculate diffuse shading
                Vector3 *light = [[Vector3 alloc] init];
                light.x = lightSource.centre.x - intersectionPoint.x;
                light.y = lightSource.centre.y - intersectionPoint.y;
                light.z = lightSource.centre.z - intersectionPoint.z;

                [light normalize];

                Vector3 * normal = [[primitiveThatWasHit getNormalAt:intersectionPoint] retain];
                if (primitiveThatWasHit.material.diffuse > 0)
                {
                    float illumination = DOT(normal, light);
                    if (illumination > 0)
                    {
                        float diff = illumination * primitiveThatWasHit.material.diffuse;
                        // add diffuse component to ray color
                        colour.red += diff * primitiveThatWasHit.material.colour.red * lightSource.material.colour.red;
                        colour.blue += diff * primitiveThatWasHit.material.colour.blue * lightSource.material.colour.blue;
                        colour.green += diff * primitiveThatWasHit.material.colour.green * lightSource.material.colour.green;
                    }
                }
                [normal release];
                [light release];
            }
        }

Comment faire pour que ça ait l'air bien ?

7voto

Larry Gritz Points 4659

C'est un effet perceptif appelé Banderolage .

Il est également très probable que vous visualisiez les images dans un espace couleur incorrect. Votre traceur de rayons effectue les calculs d'éclairage dans un espace "linéaire", mais vous visualisez très certainement ces images sur un écran à réponse non linéaire, et ne voyez donc pas les résultats corrects. Cela pourrait facilement rendre les bandes de Mach beaucoup plus proéminentes que si vous les affichiez correctement. Essayez d'en savoir plus sur correction gamma .

3voto

kiasecto Points 31

Vos yeux vous trompent. Si vous rapprochez les sphères des 3 photos, vous verrez très clairement que les zones sont de la même couleur lorsqu'elles sont éclairées par une seule lumière et plus lumineuses lorsqu'elles sont éclairées par deux lumières. Si vous voulez que cela soit plus joli, je vous suggère d'ajouter un arc entier de sources lumineuses entre les sources actuelles.

0voto

Andrew McGregor Points 7641

Vous avez saturé un canal de couleur dans l'image ; baissez un peu la luminosité et voyez ce qui se passe.

0voto

Adenine2k Points 772

Êtes-vous sûr que vos directions d'éclairage sont les deux normalisé ?

Ça peut valoir le coup de lancer un assert là-dedans.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X