gpt4 book ai didi

c++ - 我的 CG BRDF 程序有什么问题

转载 作者:行者123 更新时间:2023-11-28 07:15:08 25 4
gpt4 key购买 nike

现在我正在研究一个关于 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);

最佳答案

我建议从一个更简单的 BRDF 开始,以确保您的主循环没有被破坏——尝试像 lambert 这样简单的东西:max(0,dot(lightRay,hitNormal)) 并确保这些是归一化 vector 。如果因为灯光太多而太亮,则除以 scene->lights.size()

如果使用简单的 BRDF 图像看起来正确,现在只需尝试使用其他组件的变体。您根本没有提供 lookup_brdf_val() 的代码,因此除此之外只能推测。

不过,它就像任何其他编程一样。减少变量的数量,直到找到出错的那个。

关于c++ - 我的 CG BRDF 程序有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com