我一直在研究我的光线跟踪器.我添加了反射和多线程支持.目前我正在努力增加折射,但它只有一半工作.

如您所见,有一个中心球体(没有镜面反射高光),一个反射球体(右侧)和一个折射球体(左侧).我很高兴反思,看起来非常好.对于折射它有点工作......光被折射并且球体的所有阴影都在球体中可见(折射率1.4),但是有一个外部黑色环.
编辑:当我增加球体的折射率时,显然黑色环变大,因此球体变小.相反,当降低折射率时,球体变大,黑色环变小......直到折射率设为1,环完全消失.IOR = 1.9
IOR = 1.1
IOR = 1.00001
有趣的是,在IOR = 1时,球体失去透明度并变白.

我认为我涵盖了全部内部反思,这不是问题所在.
现在的代码:我正在使用operator |for dot产品,因此(vec|vec)是一个点积和operator ~反转向量.物体,包括ligths和spheres都存储在Object **objects;.光线跟踪功能
Colour raytrace(const Ray &r, const int &depth)
{
//first find the nearest intersection of a ray with an object
Colour finalColour = skyBlue *(r.getDirection()|Vector(0,0,-1)) * SKY_FACTOR;
double t, t_min = INFINITY;
int index_nearObj = -1;
for(int i = 0; i < objSize; i++)
{
if(!dynamic_cast<Light *>(objects[i]))//skip light src
{
t = objects[i]->findParam(r); …Run Code Online (Sandbox Code Playgroud) 所以,我在网上阅读了关于光线跟踪的内容,并在业余时间开始从零开始编写一个Raytracer.我正在使用C++,我已经学习了大约一个月了.我已经阅读了网上光线跟踪理论,到目前为止它的工作非常好.它只是一个基本的光线跟踪器,既不使用模型也不使用纹理.
起初它制作了一台雷卡斯特,并对结果非常满意.

那么我尝试了多个对象,它也有效.我刚刚在这个实现中使用了漫反射阴影,并将光的颜色添加到了没有着色的点处的对象颜色.
不幸的是,此代码不适用于多个光源.然后我开始重写我的代码,以便它支持多个灯光.我也读过Phong照明并开始工作:
它甚至适用于多个灯:

到目前为止,我很高兴,但现在我有点卡住了.我已经尝试修复这个问题很长一段时间了,但我什么也没想到.当我添加第二个球体甚至是第三个球体时,只有最后一个球体被照亮.最后,我的意思是我的数组中存储所有对象的对象.请参阅下面的代码.

显然,紫色球体应具有类似的照明,因为它们的中心位于同一平面内.令我惊讶的是,球体只有环境照明 - >阴影,但情况并非如此.
所以现在我的跟踪功能:
Colour raytrace(const Ray &r, const int &depth)
{
//first find the nearest intersection of a ray with an object
//go through all objects an find the one with the lowest parameter
double t, t_min = INFINITY;
int index_nearObj = -1;//-1 to know if obj found
for(int i = 0; i < objSize; i++)
{
//skip light src
if(!dynamic_cast<Light *>(objects[i]))
{
t = objects[i]->findParam(r);
if(t > 0 && t < t_min) …Run Code Online (Sandbox Code Playgroud)