所以我在使用 Phong 模型时遇到了问题,特别是漫反射分量,并且使用了正确的法线向量和光向量的方向。这是一个学校项目,但我不在乎我是否没有完成它,只要有人能告诉我我做错了什么。我已经尝试了一些事情,我做的最好的就是让一半的较大球体遮蔽,但方向错误。最亮的强度位于半圆的外边缘,当它向中心移动时会变暗,而应该是相反的方向。当我看到看起来像在空圆圈中着色的模型时,它看起来像是在线条上对球体进行着色。
第二个球体的阴影可能很难看到。
相关结构:
struct Ray
{
vec3 origin; // origin of the ray
vec3 dir; // direction of the ray
};
struct Sphere
{
vec3 center;
float radius;
vec3 ka, kd, ks;
vec3 reflectivity;
float alpha;
Sphere(const vec3& ic=vec3(0.0f), const float& ir=0.0f, const vec3& ika=vec3(0.0f), const vec3& ikd=vec3(0.0f), const vec3& iks=vec3(0.0f), const float& ireflectivity=0.1f, const float& ialpha=1.0f):
center(ic), radius(ir), ka(ika), kd(ikd), ks(iks), reflectivity(ireflectivity), alpha(ialpha)
{}
bool intersect(const Ray& ray, float& t0, float& t1);
};
struct PointLight
{
vec3 location;
vec3 id, is;
PointLight(const vec3& iloc=vec3(0.0f), const vec3& iid=vec3(0.0f), const vec3& iis=vec3(0.0f)):
location(iloc), id(iid), is(iis)
{}
};
vec3 color;
vec3 amb = my_sphere.ka* my_ambient_light.ia; // I = ka * ia ambient component
int temp = my_point_lights.size() - 1;
color += amb;
vec3 diff;
for (int i = my_point_lights.size() - 1; i >= 0; i--) {
vec3 n = (ray.origin + ray.dir - my_sphere.center);
normalize(n);
vec3 L = (my_point_lights[temp].location - ray.origin);
normalize(L);
diff += my_sphere.kd * my_point_lights[temp].id * std::max(dot(n, L), 0.0f);
}
color += diff;