- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基本的raytracer,我想实现景深。请你
向我推荐我可以使用的资源,书籍和代码?
谢谢
最佳答案
我从本页上的一些信息中找到了答案:http://cg.skeelogy.com/depth-of-field-using-raytracing/,尤其是底部附近的图表。我想我做起来和它的显示方式有些不同,但是概念很简单。
我可以解释发生了什么以及如何实现的一般想法(我会尽量简洁)。光线从所有方向(通常而言)上的任何给定点反射,因此实际上并不是在渲染点和您的眼睛之间穿过的一束光线,而是一束离开渲染点并向眼睛扩展的光锥。您的眼睛/相机镜头会倾向于弯曲这些光线,使视锥细胞停止膨胀并再次开始收缩。为了使物体完全聚焦,视锥应收缩到视网膜/镜架上的一个点,但这仅在距晶状体特定距离处起作用:该距离由参考页面中的“焦平面”指示(尽管我认为它实际上应该是一个以眼睛为中心的球体,而不是一个平面)。
对于焦平面前的任何事物,光锥将弯曲得更多:它将聚焦到视网膜/镜框前面的一点,然后再次开始扩展,因此在到达镜框时不再一个点,但一个圆。类似地,对于焦平面后面的点,圆锥体将减少弯曲,并且在到达框架时尚未收敛到某个点。在这两种情况下,其效果是场景最终在多个像素上被涂抹了一个点。
对于实现,您可以将这个想法变成现实:代替将场景中的每个点渲染为几个像素,您可以将多个附近的点渲染为单个像素,这当然是自“拖尾”后真正发生的情况。相邻点的“向外”光圈将最终重叠,因此每个都有助于形成像素。
所以这是我的实现方式:
首先,定义一个光圈:一个在眼睛中央且与视网膜/框架平行的平面区域。光圈越大,DOF效果越明显。孔径通常只是圆形,在这种情况下,可以很容易地通过其半径定义孔径。其他形状可能导致不同的照明效果。
还定义一个“焦距”。我不认为这实际上是正确的说法,但它是事物完全聚焦的眼睛距离。
渲染每个像素:
首先从眼睛将像正常的光线穿过像素投射到场景中。但是,您只想在光线中找到距眼睛的距离等于所选焦距的点,而不是与场景中的对象相交。将此点称为像素的焦点。
现在,在光圈上选择一个随机起点。对于圆形光圈,这很容易,您可以选择随机的极角和随机的半径(不大于光圈的半径)。您想要在整个光圈上均匀分布,不要试图将其偏向中心或任何东西。
从焦点上的光圈中的选定点投射光线。请注意,它不一定会穿过同一像素,没关系。
以您通常的方式渲染此光线(例如,路径跟踪或仅找到相交的最近点等)。
重复执行步骤2、3和4几次,每次在光圈上使用不同的随机起始点,但始终将其投射到焦点上。对所有光线的渲染颜色值求和,并将其用作该像素的值(通常,必要时除以恒定的衰减因子)。
当然,每个像素使用的光线越多,画质就越好。我一直在使用每像素约150射线来获得体面的但不是很好的质量。您可以看到较少的咬合效果(例如50或60束射线),但是较少的射线束会在图像中产生颗粒感,特别是对于那些非常模糊的物体。您需要的光线数量还取决于光圈大小:较小的光圈不需要太多的光线,但是不会获得那么多的模糊效果。
显然,这样做会极大地增加您的工作负荷,基本上是将其乘以每个像素的光线数量,因此,如果您在raytracer中还有任何优化可以做,那么现在是进行此工作的好时机。如果您碰巧有多个处理器可用,那么一个好消息是,一旦找到像素的焦点,这就会令人尴尬地并行化。
多一点解释
下图应该让您了解正在发生的事情,以及为什么它等同于在眼睛或照相机中实际发生的事情。它显示了正在渲染的两个像素,一个像素显示为红色,另一个像素显示为蓝色。从眼睛穿过每个像素延伸到焦点“平面”的虚线是您在开始时投射的光线,以确定该像素的焦点。半透明的圆锥体表示可以随意选择以渲染每个像素的完整光线(像素1的红色圆锥体,像素2的蓝色圆锥体)。注意,由于所有光线都通过焦点,因此每个圆锥会聚到恰好在焦点处的一个点。
视锥细胞的重叠区域代表场景中的点,这些点最终可能同时渲染到像素1和像素2:换句话说,被涂抹了。由于每个圆锥体都是焦点“平面”上的一个点,因此此处的圆锥体之间没有重叠,因此处于此距离的点仅呈现为单个像素:它们完全聚焦。同时,您离焦点“平面”越远(向前或向后),圆锥体越分散,因此在任何给定点上重叠的圆锥体越多。因此,非常接近或非常远离的点将趋向于渲染为大量不同的像素,因此它们将非常失焦。
关于game-physics - 在raytracer中实现景深的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532947/
我正在做一个需要翻译的项目 qemu-guest物理地址来托管虚拟/物理地址。 我正在使用 VMI(虚拟机自省(introspection))来自省(introspection) qemu 进程(KV
我正在使用下面的类,但给出了类似 Caused by: org.hibernate.DuplicateMappingException: Table [] contains physical colu
我正在 3D 中进行刚体模拟。现在我在旋转方面遇到了精度问题。最终,物体(没有外力)的方向会收敛到围绕具有最小惯性矩的轴。降低 dt 有帮助,但不是太多。有没有办法最大限度地减少这种漂移? 这是我目前
我正在尝试做一个基本版本的太空 war (http://en.wikipedia.org/wiki/Spacewar_%28video_game%29),但我不知道如何做惯性部分 那是我的代码:我应该
哪些技术用于实时模拟水等流体,例如在电子游戏中? 特别是,我正在为 Uni 的(不幸的是相当短的)物理项目寻找一个项目创意,所以越简单越好(如果流体模拟中有任何“简单”之类的东西......) 最佳答
怎么办数值积分 (什么数值方法,使用什么技巧)用于无限范围内的一维积分,其中被积函数中的一个或多个函数是 1d quantum harmonic oscillator波函数。其中,我想计算谐振子基中某
我正在遵循处理书中的一个示例,该示例描述了如何计算非正交碰撞(在非水平平面上弹跳的球),但是,我并不真正理解这四个表达式背后的逻辑。 float groundXTemp = cosine * del
在足球比赛中,我正在使用转向行为来计算转向力。这部分没问题。 但是,我正在寻找实现简单的2D人类运动的最佳方法。 例如,当转向力与当前速度或航向矢量之间的cos(角度)小于0.5时,玩家不应“转向”(
我正在写一个小船的模拟(一艘有动力而不是帆的帆船)。它有一个方向 Helm 和一个龙骨,我有大部分的物理处理推力和阻力。我已经模拟了穿过船的阻力高于沿船的阻力,以减少侧向滑动。 然而,它的行为并不完全
我的问题很简单。我有两个四面体,每个四面体都有一个当前位置、一个空间线速度、一个角速度和一个质心(实际上是旋转中心)。 有了这些数据,我试图找到一个(快速)算法,它可以精确地确定(1)它们是否会在某个
有人可以向我解释为什么Verlet集成优于Euler集成吗?为什么RK4比Verlet更好?我不明白为什么这是一种更好的方法。 最佳答案 Verlet方法擅长于仿真节能系统,其原因是辛。为了理解该语句
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我最近在排练Sprite Kit,遇到了一个很奇怪的问题。当缩放(改变其比例)父节点时,通过 SKPhysicsJointPin 连接在一起的实体逐渐彼此分离,然后关节断裂。让我给你看一下图像。 这是
Box2d中刚体的定义是 A chunk of matter that is so strong that the distance between any two bits of matter on
我正在制作一款游戏,如果您使用的是 Windows 或 Linux,您可以在这里看到:http://insertnamehere.org/birdsofprey/ 如果您在鸟上单击并按住鼠标,您可以看
我想模拟自由落体和与地面的碰撞(例如弹跳球)。物体将在真空中下落——可以忽略空气阻力。与地面的碰撞会导致一些能量损失,因此物体最终会停止移动。我使用 JOGL 渲染一个点,它是我的下落物体。重力恒定
我正在编写一个模拟,其中我们需要对一些盒子在一组传送带上移动时进行相当准确的建模。目前,我们检测盒子是否与静态传送带表面碰撞,并根据传送带的预期速度向每个盒子施加脉冲。有没有办法让实际的输送机表面移动
我正在使用 Ogre 编写物理模拟和 MOC . 我有一个从相机位置拍摄的球体,它使用相机的前向矢量沿相机面向的方向行进。 我想知道如何检测我的球体和另一个网格之间的碰撞点。 如何使用 MOC 或 O
我目前正忙于为我的 Win32 API 和 C++ 编程类(class)编写一个小球物理引擎。我已经完成了 GDI 后缓冲渲染器和整个 GUI(还有一些需要调整的东西),但我已经接近完成了。最后唯一的
我希望利用子弹物理学或类似的物理引擎来创建具有两条腿的类人 body 的逼真骨架模拟。也就是说,创建一个由圆形质量制成的“ body ”模拟在两条“腿”之上,其中每条腿由通过 3 个关节连接的 3 个
我是一名优秀的程序员,十分优秀!