我目前正在研究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);
}
}
如果我使用此代码渲染我的图像(平面上的球体),我会得到以下结果:
工件可能是由浮点精度引起的。但是,我使用了Epsilon(0.0000f),但我本可以用错误的方式实现它。谁知道如何帮助我?