我一直在尝试使用Phong模型制作有光泽的阴影,但是由于某种原因而不是有光泽的外观,我得到的只是球体前部的大白斑。最初,该模型适用于单个球体,但是现在我更新了代码,以便可以绘制多个球体,尽管应用了相同的逻辑,但该模型已开始失败,我不知道为什么。
单球:漫反射和镜面反射
分散的,多重的
漫反射+镜面反射
主要部分
vec color(const ray& r)
{
vector <sphere> objects;
vector <Light> lighting;
objects.push_back(sphere(vec(0,-100.5,-3), 100, vec(0, 1, 0)));
objects.push_back(sphere(vec(0, 0, -1), 0.5, vec(1, 0, 0)));
objects.push_back(sphere(vec(0, 1 ,-1), 0.5, vec(1, 0, 1)));
lighting.push_back(Light(vec(0, 0, -1), vec(0, -1, 0)));
float infinity = 2000.0;
sphere* closest = NULL;
vec background_color( .678, .847, .902);
vec totalLight(0.0, 0.0, 0.0);
int pos = 0;
for(int j = 0; j < objects.size(); j++)
{
float t = objects[j].intersect(r);
if(t > 0.0)
{
if(t < 2000.0)
{
infinity = t;
closest = &objects[j];
pos = j;
}
}
}
if(infinity == 2000.0)
return background_color;
else
{
float a = objects[pos].intersect(r);
vec view_dir = vec(-2, 2, 10) - r.p_at_par(a);
vec normal = unit_vector((r.p_at_par(a) - closest->centre)/closest->radius);
vec light = unit_vector(vec(-2, 0, 0) - r.p_at_par(a));
vec reflection = 2.0*dot(light, normal)*normal - light;
vec specular = vec(1, 1, 1)*pow(max(0.f, dot(reflection, view_dir)), 256);
vec diffuse = (closest->color)*max(0.f, dot(normal, light));
vec total = diffuse + specular;
return total;
}
}
据我了解,镜面反射=白色*点(view_dir,L_dir)^ n * ks,总照明度=镜面反射+漫射+环境。
最佳答案
您的镜面反射确实是正确的。您可以看到有多少光反射到我的观看方向上。
首先,我看不到您正在规范view_dir
。确保所有 vector 均已标准化。如果a和b的长度为1,则下一个为真
另外,为了将来帮助调试,您可能需要生成假彩色图像。此图像可以帮助您了解发生了什么。例如,您可以只渲染纯色,表面法线(xyz到rgb),影响某个像素的光源数量,...。这可以帮助您发现意外的行为。
希望这可以帮助。
关于c++ - RayTracing,Phong模型/镜面照明不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60334440/