我想实现物理光线跟踪器(即具有给定波长的实际光子),将自己限制在小场景(如两个球体和一个封闭盒子)中,以进行实验。它并不意味着速度快,但我会在以后优化它。
我正在收集关于光子如何与表面相互作用的所有知识,即它们要么反射(被吸收,然后再次发射),要么基于表面的吸收光谱和反射率/折射率指数折射,折射是取决于波长(自然导致色散)等...
我理解如何从发光材料(如“灯光”)中射出光子并使它们在场景中反弹直到它们碰巧落入相机时产生准确的结果,但是速度慢得令人无法接受,因此需要向后发射光子(从相机拍摄光子)
但是我无法理解表面相互作用是如何“向后”建模的 - 例如,如果来自相机的光子撞到红色框的一侧,如果光子的波长对应于红色,它将会被反射,所有其他波长将被吸收,这将产生红色。但是,通过拍摄非常接近光子的许多样本来确定颜色的强度,并检查它们中的哪一个最终与光碰撞,哪些不是?因为最终要么光子撞击光线要么没有(在给定数量的反弹之后) - 没有部分碰撞的概念。
所以基本上我的问题是 - 像素接收到的光的强度是该像素实际上是光源的光子样本数量的函数,还是其他相关的东西?
答案 0 :(得分:2)
听起来你想要做一些叫做http://en.wikipedia.org/wiki/Path_tracing的事情,就像光线追踪一样,除非当来自相机的直射光线照射到一个表面时它没有直接采样光源(导致它很慢,但不是和从光源“向前”射出光线一样慢。
然而,你似乎通过思考来自相机的“反向光子”来迷惑自己,你认为它已经具有属性(“光子的波长对应于红色”),你实际上是在试图首先做出决定。为了解决这个问题,您可能需要先阅读“常规”光线跟踪。因此,想想相机中的光线会在场景中反射到某个反射深度,或直到它们撞击物体,此时它们会直接对光源进行采样,看它们是否照亮了物体。
关于你的最后一个问题“像素接收到的光的强度是否是该像素的光子样本数量的一个函数,实际上它是光源,还是还有其他内容?”我会把你推荐给http://en.wikipedia.org/wiki/Rendering_equation,在那里你会发现渲染方程(所有3D图形算法,如光线追踪试图解决的一般数学问题)和一个有其局限性的列表,它在负面回答你的问题(即其他与光源相比,这些效果也与决定像素的最终颜色和强度有关:)
- 磷光,当光在一个时刻被吸收并在不同时间发光时发生,
- 荧光,其中吸收和发射的光具有不同的波长,
- 干涉,表现出光的波动特性,
- 次表面散射,其中入射光和离去光的空间位置不同。在不考虑次表面散射的情况下渲染的曲面可能看起来不自然地不透明。