分布式光线跟踪器的基本思想[关闭]

问题描述 投票:-1回答:2

我想要做的是改进我的实际Ray Tracer来创​​建分布式光线跟踪器。我一直在互联网上闲逛,所有我能找到的关于它的实现只是简短的事情:

- 用光线分布替换单射线 - 拍摄分布在一个区间内的多条光线 - 通过每个像素拍摄多条光线并随机改变每条光线

我的问题是:“发行”是什么意思?如何改变通过像素的光线分布?在我的普通Ray Tracer中,我每个像素拍摄一条光线。对于光线的“分布”,我可以理解我应该拍摄多个光线而不是仅仅一个。但与此同时,我用坐标(x,y)拍摄光线通过我的像素。

for (int x = 0; x < WINDOW_WIDTH; x++)
{
    for (int y = 0; y < WINDOW_HEIGHT; y++)
    {
        Vec3<float> rayDir = camera->pixelToWorld(x, y) - camera->position;
    }
}

那么,我怎样才能“随机改变每条射线”?谢谢。

c++ sampling raytracing
2个回答
1
投票

分布式光线跟踪有几种用法,可用于:

(1)抗锯齿

(2)景深效果

(3)运动模糊效果

对于(1),想法只是在每个像素中发射一束光而不是单个光线。每个光线将通过随机dx和dy(dx和dy将小于像素的大小)抖动一点点的像素中心抛出。

对于(2),它稍微复杂一点,但它大致相同的想法:每条射线都是从观察者开始并穿过像素中心的线(如果你这样做可能会抖动(1),但现在让我们忘掉它吧。这次,这是您正在抖动的观察者位置,您将在垂直于屏幕的方向上稍微抖动观察者的位置。同样,通过平均每个像素中的多个光线的贡献,背景将比前景更“模糊”,因为光线将在背景中偏离更多。

对于(3),它只是相同的想法,但这次是抖动的移动物体的位置。

注意:还有(4):具有光泽效果的复杂材料(它们需要理解一点材料,BRDF =双向反射分布函数的概念)。


0
投票

有很多不同的方法可以做到这一点,它在某种程度上取决于您在当前光线跟踪器实现中的工作。

我的方法是将问题分解为基于工作的模型。换句话说,您创建一个要由每个工作人员处理的作业队列,其中工作人员可以是线程或单独的计算机。

所有工作节点都相等,这意味着他们可以执行的工作类型没有区别。这允许您根据需要添加任意数量的工作节点(注意:在开始获得负返回之前,您可以添加多少个工作节点)。

另一个好处是你可以根据你的可用资源进行扩展 - 可能用于测试你只需要在本地机器上使用几个线程,但是当你准备制作“生产”图像时,你可能想要使用其他机器。此外,使用单个工作线程进行渲染应该可以在此设置中使用。

每个工作节点都需要访问场景,因此这是要发送的第一个数据块。然后他们就开始从作业队列中拉出来。重要的是要注意,您需要以安全的方式执行此操作 - 只允许一名工作人员申请工作。

while(active)
{
    fetch next job from job queue
    if no job is available
    {
       sleep(1)
       continue
    }

    process job
}

你需要决定的是“工作”需要什么。是单射线吗?是单射线及其随后的反弹吗?它是一批光线吗?此负载平衡决策将取决于您的光线跟踪器。单射线可能不够,但它是一个很好的起点。实际上,您可能应该从每个像素只有一条光线开始,并为每条光线做一个工作。这将为您提供良好的基线,从您开始工作开始。

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.