路径追踪条纹反射

时间:2017-05-10 21:44:26

标签: c++ graphics raytracing

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计算对我的物体的颜色贡献。

我不确定我在这里误解了什么,但任何帮助都会受到赞赏。 提前谢谢。

0 个答案:

没有答案