Диффузное компонент модели Raytracing / PhongC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Диффузное компонент модели Raytracing / Phong

Сообщение Anonymous »

Так что у меня возникли проблемы с моделью Фонга, в частности, диффузной компонентом и использованием правильного нормального вектора и направления к свету. Это для школьного проекта, но мне все равно, если я не закончу его, пока кто -то сможет сказать мне, что я делаю не так. Я уже пробовал несколько вещей, и лучшее, что я делаю, - это половина более широкой сферы в тени, но в неправильном направлении. Самая яркая интенсивность находится на внешнем краю круговой половины и становится темнее, когда она идет в центр, когда он должен быть наоборот. Похоже, что он затеняет сферу в линиях, когда я видел модели, которые выглядят так, как будто они затенены пустыми кругами. < /p>

затенение второй сферы может быть трудно увидеть.
< /p>

Соответствующие структуры: < /p>



.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;


Подробнее здесь: https://stackoverflow.com/questions/536 ... -component
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»