我正在做一个关于光线追踪的项目,现在我可以做一些基本的渲染。
下图有:
镜面反射、折射、纹理映射和阴影。
我正在尝试做光泽反射,到目前为止,这就是我得到的。谁能告诉我这张有光泽的反射图像是否有任何问题?
相比之下,下图来自镜面反射
这是我关于光泽反射的代码,基本上,一旦主光线与物体相交。从这个交点开始,它会随机射出另外 80 条光线,并取这 80 条光线颜色的平均值。我在这段代码中遇到的问题是 x 和 y 的大小,我必须将它们除以某个值,在本例中为 16,这样光泽反射光线就不会太随机。这个逻辑有什么问题吗?
Colour c(0, 0, 0);
for (int i = 0; i < 80; i++) {
Ray3D testRay;
double a = rand() / (double) RAND_MAX;
double b = rand() / (double) RAND_MAX;
double theta = acos(pow((1 - a), ray.intersection.mat->reflectivity));
double phi = 2 * M_PI * b;
double x = sin(phi) * cos(theta)/16;
double y = sin(phi) * sin(theta)/16;
double z = cos(phi);
Vector3D u = reflect.dir.cross(ray.intersection.normal);
Vector3D v = reflect.dir.cross(u);
testRay.dir = x * u + y * v + reflect.dir;
testRay.dir.normalize();
testRay.origin = reflect.origin;
testRay.nbounces = reflect.nbounces;
c = c + (ray.intersection.mat->reflectivity)*shadeRay(testRay);
}
col = col + c / 80;