Striped Reflections Image 我的Path Tracer的反射看起来很准确,但阴影有变化,这使它具有条纹效果。根据我的理解,问题来自于我在BRDF中使用的Wi和Wo矢量之间的巨大差异。更值得注意的是,当我在BRDF中对标准化因子进行硬编码时,似乎删除了条带化,但我无法推断出问题的来源。
Brdf计算:
Vector3f m = (wo + wi).normalized();
float distribution = D(m, N, material.roughness);
float geometry = G(m, N, wi, wo, material.roughness);
Vector3f fresnel = F(material.Ks, wi.dot(m));
Vector3f numerator = distribution * geometry * fresnel;
// Hard coding this removes the striping.
float denominator = 4 * std::abs(wi.dot(N)) * std::abs(wo.dot(N));
final_color = numerator / denominator;
我调用EvalBrdf,后者又在两个地方启动BRDF计算。在明确的光照阶段和隐含的光照阶段。
在显式阶段,我随机获得一个随机光点(在我的项目中只有光线),然后我向该点追踪光线并检查光线与光线上随机点的任何交点。此计算归结为PdfLight / GeometricFactor(初始交点,随机光点)。所有的灯都是球体。这条射线产生我在brdf计算中使用的Wi矢量,而Wo只是先前迭代Wi矢量的逆射线。
PdfLight计算:
float Scene::PdfLight(Sphere *Q)
{
return 1.0f / ((4.0f * pi * Q->radius_ * Q->radius_) * ray_time-
>light_list_.size());
}
几何因素:
float GeometryFactor(IntersectionData &A, IntersectionData &B)
{
Vector3f D = A.point_ - B.point_;
return std::abs((A.normal_.dot(D) * B.normal_.dot(D)) / (D.dot(D) *
(D.dot(D))));
}
第二次是当我没有非交叉点或光线的交叉点时,我正常延伸光线路径。
在交叉点后找到新的光线方向。
float cos = float(uniform_random(RNGen));
float phi = float(uniform_random(RNGen));
phi = 2.0f * pi * phi;
Vector3f m = SampleLobe(N, std::pow(cos, 1.0f/(roughness + 1)), phi);
final_sample = 2 * (wo.dot(m)) * m - wo;
样本叶
float s = std::sqrtf(1 - c * c); // sinTheta
Vector3f K(s * std::cosf(phi), s * std::sinf(phi), c);
Quaternionf q = Quaternionf::FromTwoVectors(Vector3f::UnitZ(), N);
return q._transformVector(K);
从那里我使用Wi和Wo来计算使用前面提到的BRDF计算对我的物体的颜色贡献。
我不确定我在这里误解了什么,但任何帮助都会受到赞赏。 提前谢谢。