在光线追踪中实现反射的问题

问题描述 投票:0回答:1

我已经实现了一个简单的射线跟踪器,现在我想实现反射,但对象的行为是透明的,这是我获取反射射线的代码。

        ray* reflected = new ray();
        reflected->direction = rayIn.direction - (2 * glm::dot(rayIn.direction, normal)) * normal;
        reflected->origin = int_point + epsilon * normal;
        outColor += ((int_object->reflectivity)*intersectray(*reflected, depth - 1));

这里是图片 有代码的。

img

无代码

img

如果需要更多代码,我会编辑帖子。

编辑 : 似乎问题出在我在场景中迭代对象的时候。我将对象插入为

    scene->add(sphere1);
    scene->add(sphere2);

但当我把这个改成:

    scene->add(sphere2);
    scene->add(sphere1);

输出是正确的.球体1比球体2更接近摄像机,而且它们没有重叠。

c++ graphics raytracing
1个回答
0
投票

问题是这部分代码

for (objects in scene){
    double intersection = (*objIterator)->intersect(rayIn,normal);

    if (intersection < minDistance && intersection > epsilon  )
    {
        minDistance = intersection;
        int_object = *objIterator;
        int_point = rayIn.origin + intersection * rayIn.direction + (epsilon * normal);
    }}

这里的法线在后面用于其他计算,但第一行更新的是当前对象交点的法线(即使它不接近)。所以我添加了一个向量来存储相交对象的法线,并在后面使用它。

© www.soinside.com 2019 - 2024. All rights reserved.