UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - 图形学
type: channel
link: https://blog.uwa4d.com/tag/图形学/
items: 光线追踪
items: 卡通渲染及其相关技术总结

光线追踪
type: item
date: 2022-02-07T04:47:00+02:00
description: 本文首先将会介绍光线追踪的类别族谱，介绍其公共部分，之后我们会分别对其中的每一个进行详细地剖析。 光线追踪（Ray tracing）是一个拥有历史感的词汇。图形学从业者从neutron transport、heat transfer和illumination engineering等领域引进其思想。由于这些概念被许多领域所研究，导致光线追踪的术语在学科之间和学科内部都进行着不断发展，有时也会产生分歧。经典的论文也可能会错误地使用术语，这就可能会造成混淆。所以，在介绍光线追踪的概念之前，我们需要分清楚这些术语的概念。 几乎所有的现代光线追踪器都是使用递归和蒙特卡罗方法；但是现在已经很少会有人把他们称为“递归的蒙特卡洛”方法。 一．光线追踪族谱 1.Ray Casting。1968年，Arthur Appel。 2.Whitted 光线追踪。1980年，Whitted，Kay和Greenberg提出了使用递归的光线追踪来描绘准确的折射和反射。 3.分布式光线追踪。1984年，Cook等人提出了分布式光线追踪（distributed or distribution ray tracing，DRT）。但是，这种方法通常被称为随机光线追踪（stochastic ray tracing），来避免与分布式处理（distributed processing）混淆。其和path tracing都使用了蒙特卡洛方法。 4.路径追踪。1986年引入了两个重要的算法。Kajiya将积分输运方程（integral transport equation）称为渲染方程（rendering equation）。他提出的渲染方程成了至今为止几乎所有的全局光照算法的数学依据，在同篇论文中他也提出了最原始路径追踪算法。 5.双向路径追踪（BidirectionalPath Tracing）由Lafortune和Willems提出，Veach则对双向路径追踪做了详细的描述。 6.Metropolis Light Transport。1997年Veach首次将最早应用在计算物理领域的Metropolis采样方法引入图形学。 7.Energy Redistribution Path Tracing 2005 8.Manifold Exploration 2012 二．Ray Casting 第一个用于渲染的光线投射算法最初由Arthur Appel在1968年引入。光线投射通过从观察点对每一个像素发射一条光线并找到在世界场景中阻挡光线路径的最近物体来渲染场景，Ray Casting只有两种射线，第一种是眼睛发射的eye射线，来寻找场景中的交点，另一个是从交点发到灯光的阴影射线，看自身是否是处于阴影当中。与传统扫描线渲染算法相比，光线投射的一个显着优点是能够处理不平整的表面和固体。电子世界争霸战（1982年电影Tron Series）的大部分动画都是使用光线投射技术渲染的。 早年间光栅化技术还未流行时，也会用于游戏当中。最著名的一款光线投射的游戏是Wolfenstein 3D。接下来将介绍不论在光线追踪还是光线投射算法中都通用的公共部分，避免之后的内容太过的庞杂。 2.1 光线投射基本算法 Render() for each pixel x,y color(pixel) = Trace(ray_through_pixel(x,y)) 首先做的就是创建光线，得到每一个点的光线数据结构，之后开始Trace，这里使用Trace这个函数名是为了和后面统一。是指在场景中追踪这个光线。 Trace(ray) object_point = Closest_intersection(ray) if object_point return Shade(object_point, ray) else return Background_ColorRender() for each pixel x,y color(pixel) = Trace(ray_through_pixel(x,y)) 我们在场景中寻找光线与场景中的物体是否有交点，并返回距离我们最近的那一个object的信息，如果找到，我们进行着色如果没找到我们返回设定的背景颜色。 Closest_intersection(ray) for each surface in scene calc_intersection(ray, surface) return the closest point of intersection to viewer 在光线投射的Closest_intersection中，我们并不需要额外的返回其他的复杂信息。 Shade(point, ray) to calculate contributions of e…

卡通渲染及其相关技术总结
type: item
date: 2017-05-17T04:37:00+03:00
description: 近年来，卡通渲染技术在越来越多的游戏开发中被广泛运用，如《守望先锋》、《英雄联盟》、《DOTA2》、《崩坏3》等经典游戏。笔者对这些游戏中涉及的经典技术如描边、着色等做了详细的总结，对大家项目的制作开发极具参考价值，建议收藏！ 前言：卡通渲染是图形学中一个有趣的话题，属于非真实感计算机图形学（NPR）的范畴，在NPR领域中也最多地被应用到实际游戏中，近年来流行的《守望先锋》，《英雄联盟》，《DOTA2》，《崩坏3》等游戏中都或多或少地出现过卡通渲染的身影，恰好最近对这个领域的内容作了一些了解和探索，所以就对其中涉及的一些经典技术做一个概述。 壹 · 卡通渲染的分类 在具体讨论技术手段之前，先就卡通渲染做一个分类。卡通渲染最关键的特征包括不同于真实感渲染的艺术化光影效果和描边。以这两个关键的特征为卡通渲染分类的话，可以将近年来游戏中常用的卡通渲染分为美式卡通风格和日式卡通风格。美式卡通风格在色彩上比较连续，有渐变色，着色风格很大程度上依赖于艺术家定义的色调（tone），而在阴影和高光方面常常采取夸张和变形的做法，比较典型的是《军团要塞2》；日式卡通风格往往角色造型更写实，但在着色方面，则趋向于大片大片纯色色块，并有的明暗交界，例如《崩坏3》。虽然这样的分类并没有清晰界限，但易于描述，接下来我们就按照美式卡通和日式卡通的分类，从光影和描边两个维度上分别列举各类技术实现。 军团要塞2的卡通渲染，人物造型夸张，但着色连续，接近真实感光照 崩坏3游戏截图，着色以单色色块为主，有明显的明暗交界 贰· 描边 描边是一个比较常用的技术，在《Real Time Rendering》中有相当篇幅的综述，大致来说包含了三类： （1）基于视角的勾边，这部分的计算依赖于我们的一个直觉观察：当我们的视线和某个表面相切时，这个表面上的像素点往往就是模型的边缘，基于这个观察，我们可以用dot(viewDir, normal)^{k} 来估计一个像素的“边缘程度”，当然，这个值也可以用来作为纹理坐标去采样一张预定义的“轮廓纹理”。 基于视角的描边，最大的缺点是线宽粗细差别较大，不易控制 （2）基于几何生成方法的描边，这类方法的特点是描边本身是一个单独的几何体，通过特殊的方法绘制出来，比较常见的做法是shell method，原理和实现都比较简单：首先在绘制结束正常的模型后，将需要描边的物体改用正面剔除再绘制一遍，在VS中将顶点沿着法线方向膨胀一定距离，然后在FS中将模型用纯色输出。另外一种叫做z-bias的方法，也是绘制背面，但不膨胀，而是把背面顶点的Z值稍微向前偏移一点点，使得背面的些许部分显示出来形成描边效果。 基于shell method的绘制方法，实现简单，线宽较为均匀 （3）基于图像处理的描边，这类方法的实现可以说更接近于“边缘”这一概念的本质定义，什么是“边缘”呢？边缘就是在深度或者法线上不连续的位置。因此为了获取边缘，我们只需要在图片上找到深度或者法线不连续的位置即可，因此，我们需要将深度信息和法线信息以贴图的形式传入，运用边缘检测算法去寻找这些像素。这类方法的优点是描边的线宽一致，缺点是需要额外的法线和深度信息，当然，由于近年来流行的延迟渲染框架，法线和深度本来就是G-Buffer的一部分，因此往往不需要额外绘制法线和深度的信息。 基于边缘检测的描边方法，分别用深度信息和法线信息进行单独的边缘检测，而后合并起来成为最终的描边 美式卡通中的做法 美式卡通中往往倾向于使用基于图像处理的描边方法来生成均匀一致的描边效果。在《英雄联盟》中小兵和英雄的勾边效果就是用Sobel算子对深度信息进行边缘检测来获得的。由于游戏中只需要针对小兵和英雄勾边而不需要对场景地图进行勾边，因此在LOL中，勾边的计算并非全屏后处理，而是逐物体进行的，这样的好处是可以随意控制哪些物体描边，每个物体可以单独指定描边颜色，缺点是当物体较多时（尤其是skinned mesh较多时）计算量会增大。一个折衷的方案是，在进行正常绘制的阶段用stencil buffer标记出需要描边的物体，然后用一个全屏的后处理，对stencil buffer标记的像素进行边缘检测，当然这样的话，就很难给每个物体单独指定描边颜色了。 实际上，在LOL中有两种类型的描边，一种是小兵和英雄的固定描边，另一种是防御塔发出攻击警报或者某个单位被点选时才产生的红色描边，这两种描边在处理上略有差别，前者直接使用边缘检测的结果作为最终描边，而后者则是对边缘检测结果再进行一次模糊，借此来扩大和柔化描边效果。 LOL中两种类型的描边，可以看出第二类描边的线宽更宽，并且有明显的过度效果 日式卡通中的做法 日式卡通中往往倾向于使用基于几何体生成的方法去描边，这类描边方法相较于另两类方法的好处在于线宽更容易为美术所控制，而在日式…