现在我正在研究一个关于BRDF的基本CG程序。在我得到图像之后,似乎所有面对光线的点太亮了,我不知道原因。这是我的代码,我尝试调用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 :(得分:1)
我建议从一个更简单的BRDF开始,以确保你的主循环没有被破坏 - 尝试像lambert这样简单的事情:max(0,dot(lightRay,hitNormal))
并确保它们是规范化的向量。如果因为光线太多而太明亮,请除以scene->lights.size()
。
如果使用简单的BRDF图像看起来正确,现在只需使用其他组件的变体进行尝试即可。您根本没有提供lookup_brdf_val()
的代码,因此除此之外,您只能推测。
它就像任何其他编程一样。减少变量的数量,直到找到错误的变量。