咋建网站,万网老板是谁,百度seo引流怎么做,成都网站建设十强企业我们已经涵盖了所有要说的内容#xff01; 我们现在准备编写第一个光线追踪器。 你现在应该能够猜测光线追踪算法是如何工作的。
首先#xff0c;请花点时间注意一下#xff0c;光在自然界中的传播只是从光源发出的无数光线#xff0c;它们四处反弹#xff0c;直到到达我…我们已经涵盖了所有要说的内容 我们现在准备编写第一个光线追踪器。 你现在应该能够猜测光线追踪算法是如何工作的。
首先请花点时间注意一下光在自然界中的传播只是从光源发出的无数光线它们四处反弹直到到达我们眼睛的表面。 因此光线追踪非常优雅因为它直接基于我们周围发生的事情。 除了它以相反的顺序遵循光路这一事实之外它不亚于一个完美的自然模拟器。 NSDT工具推荐 Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 光线追踪算法获取由像素组成的图像。 对于图片中的每个像素它都会向场景中发射主光线。 该主光线的方向是通过追踪从眼睛到该像素中心的线来获得的。 一旦我们设置了主光线的方向我们就会检查场景中的每个对象看看它是否与其中任何一个对象相交。 在某些情况下主光线将与多个对象相交。 当发生这种情况时我们选择交点最接近眼睛的对象。 然后我们从交点向光源发射阴影光线图 1 图 1我们通过像素中心发射主光线来检查可能的物体相交。 当我们找到一个点时我们会投射阴影射线来确定该点是被照亮还是在阴影中
如果该光线在到达光源的途中未与物体相交则命中点将被照亮。 如果它与另一个对象相交该对象就会在其上投射阴影图 2 图 2小球体在大球体上投射阴影。 阴影光线在到达光源之前与小球体相交
如果我们对每个像素重复此操作就会获得三维场景的二维表示图 3 图 3为了渲染帧我们为帧缓冲区的每个像素发射主光线这是该算法的伪代码实现
这是该算法的伪代码实现
for (int j 0; j imageHeight; j) { for (int i 0; i imageWidth; i) { // compute primary ray directionRay primRay; computePrimRay(i, j, primRay); // shoot prim ray in the scene and search for the intersectionPoint pHit; Normal nHit; float minDist INFINITY; Object object NULL; for (int k 0; k objects.size(); k) { if (Intersect(objects[k], primRay, pHit, nHit)) { float distance Distance(eyePosition, pHit); if (distance minDistance) { object objects[k]; minDistance distance; //update min distance } } } if (object ! NULL) { // compute illuminationRay shadowRay; shadowRay.direction lightPosition - pHit; bool isShadow false; for (int k 0; k objects.size(); k) { if (Intersect(objects[k], shadowRay)) { isInShadow true; break; } } } if (!isInShadow) pixels[i][j] object-color * light.brightness; else pixels[i][j] 0; }
}
正如我们所看到的光线追踪的美妙之处在于它只需要几行代码即可 一个人可以用 200 行写出一个基本的光线追踪器。 与其他算法例如扫描线渲染器不同光线追踪只需很少的努力即可实现。
Arthur Appel 于 1969 年在一篇题为“实体着色机器渲染的一些技术”的论文中首次描述了这项技术。 那么如果这个算法如此美妙为什么它没有取代所有其他渲染算法呢 当时甚至在某种程度上今天主要原因是速度。 正如阿佩尔在他的论文中提到的
这种方法非常耗时通常需要比线框图多数千倍的计算时间才能获得有益的结果。 大约一半的时间用于确定投影和场景的点对点对应关系。 换句话说它很慢正如 Kajiya - 所有计算机图形学历史上最有影响力的研究人员之一 - 曾经说过“光线追踪并不慢 - 计算机才是”。 找到光线和几何体之间的交点非常耗时。 几十年来算法的速度一直是光线追踪的主要缺点。 然而随着计算机变得越来越快这不再是一个问题。 尽管仍然必须说一件事与其他技术例如 z 缓冲区算法相比光线追踪仍然要慢得多。 然而如今有了快速的计算机我们可以在几分钟或更短的时间内计算出过去需要一小时的帧。 实时和交互式光线追踪器是一个热门话题。
总而言之必须记住渲染例程可以被视为两个独立的进程。 第一个步骤确定对象表面的某个点从特定像素可见性部分是否可见第二个步骤对该点进行着色着色部分。 不幸的是这两个步骤都需要昂贵且耗时的射线几何相交测试。 该算法优雅而强大但迫使我们以渲染时间换取准确性反之亦然。 自从阿佩尔发表他的论文以来人们已经进行了大量研究来加速射线与物体的相交例程。 随着计算机变得更加强大并与这些加速技术相结合光线追踪变得可以在日常生产环境中使用并且按照当今的标准它是大多数如果不是全部渲染离线软件所使用的事实上的方法。 视频游戏引擎仍在使用光栅化算法。 然而随着最近 GPU 加速光线追踪2017-2018和 RTX 技术的出现实时光线追踪也已成为可能。 虽然一些视频游戏已经提供了可以打开光线追踪的模式但它仅限于简单的效果例如清晰的反射和阴影。 原文链接光线追踪算法实现 - BimAnt