Итак, у меня возникли проблемы с моделью Фонга, особенно с диффузным компонентом, и с использованием правильного вектора нормали и направления вектора света. Это для школьного проекта, но мне все равно, если я его не закончу, пока кто-нибудь может сказать мне, что я делаю неправильно. Я уже пробовал кое-что, и лучшее, что у меня получилось, это затенить половину большей сферы, но в неправильном направлении. Самая яркая интенсивность находится на внешнем краю половины круга и становится темнее по мере продвижения к центру, когда должно быть наоборот. Похоже, что он затеняет сферу линиями, когда я видел модели, которые выглядят так, как будто он затеняет пустыми кругами.
Затенение второй сферы может быть трудно увидеть.
Соответствующие структуры:
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;