C ++ RayTracer中的折射给出了工件

时间:2015-06-24 23:25:07

标签: c++ raytracing

我目前正在研究RayTracer的折射功能。出于某种原因,我无法让它发挥作用。它肯定会渲染出与平常不同的图像,但它中有很多文物,并且它不是透明的#34;。我的折射功能是:

void computeRefractedLight( const Vec3Df & origin, const Vec3Df & dest, int & level, Vec3Df & hit, Vec3Df & color, int & triangleIndex, Vec3Df & hitnormal)
{
    //Calculate normal of triangle
    Triangle triangle3d = MyMesh.triangles[triangleIndex];
    Vec3Df normal = hitnormal;

    // Normalize the direction of the ray hitting the triangle
    Vec3Df viewDir = hit - origin;
    viewDir.normalize();

    // Breaking index (hardcoded for now)
    float n = 1.5f;

    float dotNV = n * (Vec3Df::dotProduct(normal, viewDir));
    float sqrtNV = (1 - ((Vec3Df::dotProduct(normal, viewDir))*(Vec3Df::dotProduct(normal, viewDir))));
    if(sqrtNV < EPSILON)
        return;
    else
    {
        Vec3Df result = ((dotNV - sqrtf(1 - (n * n) * sqrtNV)) * normal) - (n * viewDir);
        std::cout << "Calculating refraction" << std::endl;
        performRayTracing(hit, result, level, color);
    }
}

如果我使用此代码渲染我的图像(平面上的球体),我会得到以下结果:

enter image description here

工件可能是由浮点精度引起的。但是,我使用了Epsilon(0.0000f),但我本可以用错误的方式实现它。谁知道如何帮助我?

0 个答案:

没有答案