Что не так с моей программой BRDF в CG

Сейчас я работаю над базовой программой CG о BRDF. И после того, как я получил изображение, кажется, что все точки, обращенные к свету, слишком яркие, я не знаю причину. И вот мой код, где я пытался вызвать функцию lookup_brdf_val.

Vec3f hitNormal = ray.hit->getNormal(ray);
if(hitNormal * ray.dir > 0)
hitNormal = -hitNormal;
result = Vec3f(0, 0, 0);
Ray lightRay;
lightRay.org = ray.org + ray.dir * ray.t;
Vec3f intensity;
for(unsigned int l = 0; l < scene->lights.size(); l++)
{
scene->lights[l]->illuminate(lightRay, intensity);
if(!scene->isOccluded(lightRay))
{
double theta1,theta2;
// Calculate the theta1 and theta2.
theta1 = acosf(-(ray.dir * hitNormal));
theta2 = acosf(lightRay.dir * hitNormal);

// Calculate the fi1 and fi2.
double fi1 = 0;
Vec3f O = ray.org + ray.dir * ray.t;
Vec3f A = O - ray.dir;
Vec3f C = (ray.dir * hitNormal) * hitNormal + A;
Vec3f B = lightRay.dir + O;
Vec3f D = ((-lightRay.dir) * hitNormal) * hitNormal + B;
Vec3f OC = C - O;
Vec3f OD = D - O;
double fi2 = acosf((OD * OC) / (length(OD) * length(OC)));

double x = 0;
double y = 0;
double z = 0;
double &r = x;
double &g = y;
double &b = z;

read->lookup_brdf_val(theta1, fi1, theta2, fi2, r, g, b);

result += Vec3f(r * scale.x * intensity.x, g * scale.y * intensity.y, b * scale.z * intensity.z);

0

Решение

Я предлагаю начать с более простой BRDF, чтобы убедиться, что ваш основной цикл не нарушен — попробуйте что-нибудь простое, например, lambert: max(0,dot(lightRay,hitNormal)) и убедитесь, что это нормализованные векторы. Поделить на scene->lights.size() если он просто слишком яркий, потому что у вас слишком много света.

Если изображение выглядит правильно с простым BRDF, теперь попробуйте его с вариациями других ваших компонентов. Вы не даете код для lookup_brdf_val() вообще, так что дальше этого можно только строить догадки.

Это как и любое другое программирование. Уменьшайте количество переменных, пока не найдете ту, которая ошибочна.

1

Другие решения

Других решений пока нет …