我有一个简单的光线跟踪器,只能回到第一个交叉点。使用两个不同的光源,场景看起来很好,但是当两个灯都在场景中时,有一个黑暗的阴影,即使在另一个光源的照明区域的中间,一端的照明区域也是如此(特别是在绿球)。从“两个光源点亮的区域”到“仅由一个光源点亮的区域”的过渡似乎比“仅由一个光源点亮的区域”稍微暗一些。
我添加灯光效果的代码是:
// 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];
}
}
我怎样才能让它看起来正确?
答案 0 :(得分:7)
这是一种名为Mach banding的感知效果。
您也很可能在错误的色彩空间中查看图像。您的光线跟踪器在“线性”空间中进行光照数学运算,但几乎可以肯定您在具有非线性响应的显示器上查看这些图像,因此甚至看不到正确的结果。这可能很容易使马赫乐队比你正确展示它们更加突出。尝试了解gamma correction。
答案 1 :(得分:3)
你的眼睛在贬低你。如果您将3张图片中的球体移动到一起,您将非常清楚地看到单个灯光时区域颜色相同,双灯光时区域颜色更亮。如果你想让它看起来更漂亮,我建议你在当前光源之间添加一整圈光源。
答案 2 :(得分:0)
你已经在图像中饱和了一个颜色通道;稍微调低亮度,看看会发生什么。
答案 3 :(得分:0)
你确定你的照明方向都正常化吗?
可能值得在那里抛出一个断言。