gpt4 book ai didi

graphics - 光线追踪中的光泽反射

转载 作者:行者123 更新时间:2023-12-02 05:08:49 25 4
gpt4 key购买 nike

我正在做一个关于光线追踪的项目,现在我可以做一些基本的渲染。

下图有:

镜面反射,折射,纹理贴图和影子。

enter image description here

我正在尝试进行光泽反射,到目前为止这就是我得到的。谁能告诉我这个光泽反射图像是否有问题?

enter image description here

相比之下,下图来自镜面反射

enter image description here

这是我关于光泽反射的代码,基本上,一旦主光线与物体相交。从这个交点开始,它会随机射出另外 80 条光线,并取这 80 条光线颜色的平均值。我在这段代码中遇到的问题是 x 和 y 的大小,我必须将它们除以某个值,在本例中为 16,这样光泽反射光线就不会太随机。这个逻辑有什么问题吗?

             Colour c(0, 0, 0);

for (int i = 0; i < 80; i++) {

Ray3D testRay;
double a = rand() / (double) RAND_MAX;
double b = rand() / (double) RAND_MAX;
double theta = acos(pow((1 - a), ray.intersection.mat->reflectivity));
double phi = 2 * M_PI * b;
double x = sin(phi) * cos(theta)/16;
double y = sin(phi) * sin(theta)/16;
double z = cos(phi);
Vector3D u = reflect.dir.cross(ray.intersection.normal);
Vector3D v = reflect.dir.cross(u);
testRay.dir = x * u + y * v + reflect.dir;
testRay.dir.normalize();

testRay.origin = reflect.origin;
testRay.nbounces = reflect.nbounces;
c = c + (ray.intersection.mat->reflectivity)*shadeRay(testRay);
}
col = col + c / 80;

最佳答案

除了在编码时永远不会很好的硬编码常量之外,还有一个更微妙的问题,尽管您的图像整体看起来不错。

蒙特卡洛积分包括对生成这些样本的被积函数除以概率密度函数 (pdf) 求和。因此,您的代码中存在两个问题:

  • 虽然您似乎使用了 Phong 模型的 pdf(如果我能很好地识别它;至少它不是统一的 pdf),但您没有除以 pdf
  • 您已将 xy 组件进一步缩放 1./16. 显然没有任何理由进一步更改您的 pdf。

想法是,如果您能够准确地根据 Phong 模型乘以余弦定律对光线进行采样,那么您甚至不必将被积函数乘以 BRDF。在实践中,没有精确的公式可以准确地采样 BRDF(Lambertian 除外),因此您需要计算:
像素值 = BRDF*cosine*incoming_light/pdf 之和
如果 BRDF*cosine = pdf,这主要抵消了。

当然,你的图像整体看起来不错,所以如果你对物理合理性不感兴趣,那也不错。
Global Illumination Compendium 关于计算机图形学和蒙特卡洛积分(使用适当的公式)中使用的各种 pdf 的一个很好的来源。菲利普·杜特雷 (Philip Dutré) 着。

关于graphics - 光线追踪中的光泽反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15846867/

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