为什么我的光线追踪球体在用多个光源点亮时会出现暗线?

时间:2010-04-16 23:27:09

标签: objective-c raytracing

我有一个简单的光线跟踪器,只能回到第一个交叉点。使用两个不同的光源,场景看起来很好,但是当两个灯都在场景中时,有一个黑暗的阴影,即使在另一个光源的照明区域的中间,一端的照明区域也是如此(特别是在绿球)。从“两个光源点亮的区域”到“仅由一个光源点亮的区域”的过渡似乎比“仅由一个光源点亮的区域”稍微暗一些。

Hosted by 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 个答案:

答案 0 :(得分:7)

这是一种名为Mach banding的感知效果。

您也很可能在错误的色彩空间中查看图像。您的光线跟踪器在“线性”空间中进行光照数学运算,但几乎可以肯定您在具有非线性响应的显示器上查看这些图像,因此甚至看不到正确的结果。这可能很容易使马赫乐队比你正确展示它们更加突出。尝试了解gamma correction

答案 1 :(得分:3)

你的眼睛在贬低你。如果您将3张图片中的球体移动到一起,您将非常清楚地看到单个灯光时区域颜色相同,双灯光时区域颜色更亮。如果你想让它看起来更漂亮,我建议你在当前光源之间添加一整圈光源。

答案 2 :(得分:0)

你已经在图像中饱和了一个颜色通道;稍微调低亮度,看看会发生什么。

答案 3 :(得分:0)

你确定你的照明方向正常化吗?

可能值得在那里抛出一个断言。