在光线追踪器中实现软阴影
Implementing soft shadows in a ray tracer
我想做的是在我用c++开发的简单光线追踪器中实现软阴影。如果我没理解错的话,这背后的想法是向光源发射多束光线,而不是向光源中心发射一束光线,然后平均结果。因此,光线被射向光的不同位置。到目前为止,我使用的是随机点,我不知道这是否正确,或者我是否应该使用在光表面上规律分布的点。假设我做的是对的,我选择一个随机的点,在我的框架中被实现为一个球体。这是由:
Vec3<T> randomPoint() const
{
T x;
T y;
T z;
// random vector in unit sphere
std::random_device rd; //used for the new <random> library
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(-1, 1);
do
{
x = dis(gen);
y = dis(gen);
z = dis(gen);
} while (pow(x, 2) + pow(y, 2) + pow(z, 2) > 1); // simple rejection sampling
return center + Vec3<T>(x, y, z) * radius;
}
在此之后,我不知道我应该如何确切地移动,因为我的渲染方程(在我简单的光线追踪器)定义如下:
Vec3<float> surfaceColor = 0
for(int i < 0; i < lightsInTheScene.size(); i++){
surfaceColor += obj->surfaceColor * transmission *
std::max(float(0), nHit.dot(lightDirection)) * g_lights[i]->emissionColor;
}
return surfaceColor + obj->emissionColor;
其中传输是一个简单的浮点数,设置为0,以防射线从我的hitPoint到lightCenter用于查找中间的对象。
所以,我要做的是:
- 向光线上的随机点创建多条光线
- 计算它们在路径上撞到一个物体的数量并记住这个数字
std::max(float(0), nHit.dot(lightDirection))
我不知道如何改变,因为我不再有一个指向光中心的lightDirection。你能帮我了解一下我应该怎么做,到目前为止有什么问题吗?提前感谢!
您应该为所选的光样本评估整个BRDF。然后,你也会有光的方向(从物体位置到选定的光样本的向量)。你可以取这些结果的平均值。请注意,大多数区域光具有非各向同性的光发射特性(即从一个点发射的光量随出射方向而变化)。
平均可见性不会产生正确的结果(尽管它们通常在视觉上是合理的)。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 光线跟踪器-实现阴影
- 解释在opencv中实现的阴影检测代码的工作原理
- 在光线追踪器中实现软阴影