Почему мои сферические лучи имеют темные линии при освещении несколькими источниками света? - PullRequest
3 голосов
/ 17 апреля 2010

У меня есть простой raytracer, который работает только до первого пересечения. Сцена выглядит хорошо с двумя разными источниками света, но когда оба источника находятся в сцене, появляются темные тени, где освещенная область от одного конца заканчивается, даже если в середине освещенной области находится другой источник света (особенно это заметно зеленый шар). Переход от «области, освещаемой обоими источниками света», к «области, освещаемой только одним источником света», кажется немного темнее, чем «область, освещенная только одним источником света».

Размещено на imgur.com

Код, в который я добавляю световые эффекты:

// 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];
            }
        }

Как мне сделать так, чтобы она выглядела правильно?

Ответы [ 4 ]

7 голосов
/ 17 апреля 2010

Это перцептивный эффект, называемый Мах, полоса .

Вы также очень вероятно просматриваете изображения в неправильном цветовом пространстве. Ваш трассировщик лучей выполняет осветительную математику в «линейном» пространстве, но тогда вы почти наверняка просматриваете эти изображения на дисплее с нелинейным откликом и, следовательно, даже не видите правильных результатов. Это может легко сделать полосы Маха намного более заметными, чем если бы вы отображали их правильно. Попробуйте узнать о гамма-коррекции .

3 голосов
/ 17 апреля 2010

Твои глаза решают тебя. Если вы сдвинете сферы из трех изображений вместе, вы очень четко увидите, что области имеют одинаковый цвет, когда один свет, и ярче, когда дважды освещены. Если вы хотите, чтобы это выглядело лучше, я предлагаю вам добавить целую дугу источников света между текущими.

0 голосов
/ 17 апреля 2010

Вы уверены, что ваши направления освещения оба нормализованы?

Может быть, стоит бросить там утверждение.

0 голосов
/ 17 апреля 2010

Вы насыщены одним цветным каналом в изображении; немного уменьшите яркость и посмотрите, что произойдет.

...