Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么我的光线跟踪球体在使用多个光源照明时有暗线?_Objective C_Raytracing - Fatal编程技术网

Objective c 为什么我的光线跟踪球体在使用多个光源照明时有暗线?

Objective c 为什么我的光线跟踪球体在使用多个光源照明时有暗线?,objective-c,raytracing,Objective C,Raytracing,我有一个简单的光线跟踪器,它只在第一个交叉点工作。场景用两个不同的光源看起来不错,但是当两个灯都在场景中时,从一个末端有照明的区域有暗阴影,即使在从另一个光源(特别是在绿色球上特别明显)的照明区域的中间。从“由两个光源照亮的区域”到“仅由一个光源照亮的区域”的过渡似乎比“仅由一个光源照亮的区域”稍暗 我添加灯光效果的代码是: // trace lights for ( int l=0; l<primitives.count; l++) { Pri

我有一个简单的光线跟踪器,它只在第一个交叉点工作。场景用两个不同的光源看起来不错,但是当两个灯都在场景中时,从一个末端有照明的区域有暗阴影,即使在从另一个光源(特别是在绿色球上特别明显)的照明区域的中间。从“由两个光源照亮的区域”到“仅由一个光源照亮的区域”的过渡似乎比“仅由一个光源照亮的区域”稍暗

我添加灯光效果的代码是:

// 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];
            }
        }
//跟踪灯
对于(int l=0;l 0)
{
浮动照明=点(正常,光);
如果(照明>0)
{
float diff=照明*原语washit.material.diffuse;
//将漫反射组件添加到光线颜色
color.red+=diff*原语washit.material.color.red*光源.material.color.red;
color.blue+=diff*原语washit.material.color.blue*光源.material.color.blue;
color.green+=diff*原语washit.material.color.green*光源.material.color.green;
}
}
[正常释放];
[光释放];
}
}

我怎样才能使它看起来正确呢?

你的眼睛决定着你。如果将3张图片中的球体移动到一起,您将非常清楚地看到,当单光照时,这些区域的颜色相同,而当双光照时,这些区域的颜色更亮。如果你想让它看起来更好,我建议你在当前的光源之间加一整条弧线。

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

这是一种称为的感知效果


您也很可能在错误的颜色空间中查看图像。光线跟踪器在“线性”空间中进行照明计算,但几乎可以肯定的是,在显示器上查看这些图像时会产生非线性响应,因此甚至看不到正确的结果。这很容易使马赫带比正确显示马赫带更加突出。尝试了解。

您确定您的照明方向都正常化了吗


可能值得在这里添加断言。

可以肯定,这只是重叠高光中的幻觉。是的,你完全正确。我使用了一个颜色选择器工具,对我怀疑的像素进行了比较。事实证明,它们只是看起来更暗,它们实际上是相同的颜色。