c – 光线跟踪不正确的软阴影采样
发布时间:2020-12-16 07:14:22 所属栏目:百科 来源:网络整理
导读:您好我正在研究光线追踪算法,我坚持使用蒙特卡罗算法.虽然渲染没有区域光,但我的渲染输出是正确的但是当我将区域光实现添加到源代码以生成软阴影时,我遇到了问题. 这是前后输出图像. 当我向下移动蓝色球体时,问题仍在继续(注意当球体沿着白色虚线时,人工制品
您好我正在研究光线追踪算法,我坚持使用蒙特卡罗算法.虽然渲染没有区域光,但我的渲染输出是正确的但是当我将区域光实现添加到源代码以生成软阴影时,我遇到了问题.
这是前后输出图像. 当我向下移动蓝色球体时,问题仍在继续(注意当球体沿着白色虚线时,人工制品会继续). 这是功能: template <typename T> CVector3<T> UConeSample(T u1,T u2,T costhetamax,const CVector3<T>& x,const CVector3<T>& y,const CVector3<T>& z) { T costheta = Math::Lerp(u1,costhetamax,T(1)); T sintheta = sqrtf(T(1) - costheta*costheta); T phi = u2 * T(2) * T(M_PI); return cosf(phi) * sintheta * x + sinf(phi) * sintheta * y + costheta * z; } 我正在从van Der Corput序列生成随机浮点u1,u2值. CPoint3<float> CSphere::Sample(const CLightSample& ls,const CPoint3<float>& p,CVector3<float> *n) const { // translate object to world space CPoint3<float> pCentre = o2w(CPoint3<float>(0.0f)); CVector3<float> wc = Vector::Normalize(pCentre - p); CVector3<float> wcx,wcy; //create local coordinate system from wc for uniform sample cone Vector::CoordinateSystem(wc,&wcx,&wcy); //check if inside,epsilon val. this is true? if (Point::DistSquare(p,pCentre) - radius*radius < 1e-4f) return Sample(ls,n); // Else outside evaluate cosinus theta value float sinthetamax2 = radius * radius / Point::DistSquare(p,pCentre); float costhetamax = sqrtf(Math::Max(0.0f,1.0f - sinthetamax2)); // Surface properties CSurfaceProps dg_sphere; float thit,ray_epsilon; CPoint3<float> ps; //create ray direction from sampled point then send ray to sphere CRay ray(p,Vector::UConeSample(ls.u1,ls.u2,wcx,wcy,wc),1e-3f); // Check intersection against sphere,fill surface properties and calculate hit point if (!Intersect(ray,&thit,&ray_epsilon,&dg_sphere)) thit = Vector::Dot(pCentre - p,Vector::Normalize(ray.d)); // Evaluate surface normal ps = ray(thit); *n = CVector3<float>(Vector::Normalize(ps - pCentre)); //return sample point return ps; } 有没有人有什么建议?谢谢. 解决方法
我解决了这个问题.
>问题是由轻样本类中的RNG “Random Number Generator”算法引起的(需要分布均匀的u1,u2:low discrepancy sampling). 光线跟踪需要更复杂的RNG(其中一个“The Mersenne Twister”伪随机数发生器)和良好的混洗算法. 我希望它会有所帮助.感谢所有发表评论的人. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |