我已经实现了一个简单的射线跟踪器,现在我想实现反射,但对象的行为是透明的,这是我获取反射射线的代码。
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));
这里是图片 有代码的。
无代码
如果需要更多代码,我会编辑帖子。
编辑 : 似乎问题出在我在场景中迭代对象的时候。我将对象插入为
scene->add(sphere1);
scene->add(sphere2);
但当我把这个改成:
scene->add(sphere2);
scene->add(sphere1);
输出是正确的.球体1比球体2更接近摄像机,而且它们没有重叠。
问题是这部分代码
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);
}}
这里的法线在后面用于其他计算,但第一行更新的是当前对象交点的法线(即使它不接近)。所以我添加了一个向量来存储相交对象的法线,并在后面使用它。