关于计算机图形学:游戏中的动态阴影下

本篇分为高低两篇,上篇内容请关注:游戏中的动静暗影(上) 六、基于Shadowmap实现软暗影1. Percentage-Closer Filtering(PCF)采样Shadowmap时,咱们往往这样来实现一些软暗影的成果:在指标采样点四周,进行四次采样,而后取平均值,作为最终后果。留神这里的取平均值,并不是取平均值后进行比拟,而是对四个采样点,别离进行深度测试,而后每个采样点的0或1的后果值进行均匀,这样在半影区域就能失去软暗影成果。 这种将采样后果进行均匀的形式叫做Percentage-Closer Filtering(PCF)[6],PCF通过将指标点左近的采样后果均匀,来模拟出半影的成果。 当初的硬件都间接提供四周四点采样的加权PCF深度测试,比方OpenGL中的sampler2DShadow,DirectX中的SampleCmp。这种采样的加权形式相似于一般像素采样时的双线性采样,在指标地位左近2X2像素中,逐像素进行深度比拟,失去后果值0或1,而后将后果依照绝对四周像素地位进行加权均匀。 间接应用硬件PCF,只能采样到2X2的像素点,失去的半影过渡,往往不够柔和。如果想要更加柔和的暗影过渡,或者把半影区域扩充,就须要将采样点散布范畴扩充,也须要减少采样点的个数。 简略的形式,是间接在指标点四周依照Grid模式进行采样,然而这样往往会在半影中看到分层的瑕疵。 因而咱们更加罕用的形式,是应用预计算好的Possion散布的采样点,来进行采样。为了使后果进一步平滑,咱们还能够应用逐像素的噪声值,对采样点地位进行旋转,这样每两个相邻的像素点,采样的模式都是不同的,能够无效地平滑半影区域。从左到右顺次是:4X4的Grid采样12点Possion采样12点Possion采样+旋转Possion分布图 2. PCF软暗影的Bias问题在后面咱们曾经讲过Bias的问题,在PCF采样中,因为PCF采样Shadowmap的范畴会比拟大,因而会进一步暴露出Shadow Acane的问题。当然咱们也有响应的伎俩来解决这些问题。 一种简略的形式,是依据PCF filter kernel的大小,来动静扭转Shadow Bias的大小,当然这样做的毛病也很显著,就是PCF kernel越大,就会损失越多的暗影精度信息。 另外一种形式是Bias Cone,依据以后采样点到采样核心的地位,来缩放Bias的大小,如下图右边所示。是一种绝对简略无效的缓解Bias问题的计划。左:Bias Cone;右:Receiver Plane Depth Bias 上图左边显示的一种逐采样点来做准确Bias的算法:Receiver Plane Depth Bias。这种形式须要假设承受暗影的是一个立体,而后会依据每个暗影采样点到核心的地位,来计算偏移。个别能产生十分好的后果[7]。 3. Percentage-Closer Soft Shadows(PCSS)PCF暗影的一个毛病,就是半影的宽度十分固定,无论产生暗影的地位间隔光照有多远,半影的宽度都是一样的。 PCSS[8]通过判断半影到遮挡物和半影到光源的间隔,来动静确定半影的宽度。半影宽度越大,采样暗影的模式散布也越大,就能失去越柔和的暗影。这样就能失去如下图左边所示的,随间隔变动的暗影成果。左:PCF硬暗影,中:PCF软暗影,右:PCSS暗影 PCSS算法分成这样几个步骤: 计算出区域内均匀Blocker深度;依据Blocker深度,计算出须要的半影宽度;用半影宽度,作为PCF kernal的大小,计算出暗影。PCSS的计算其实很简略,就是依据三角形类似,来计算出采样所需的散布间隔,而后将间隔内的采样值进行均匀。 不过当半影宽度十分大时,就须要十分多的采样点,这样采样Shadowmap的开销也会变大。因而PCSS是一种不太稳固的软暗影计划,在游戏中的理论利用并不是特地多。 七、基于Shadowmap的逐物体暗影/Per Obejct Shadow1. Modulated shadow的实现后面咱们讲到的立体暗影,只能投射暗影到立体上,在应用Shadowmap保留深度后,就能够将暗影投射到任意的曲面上,具体放办法如下: 首先咱们失去须要渲染暗影物体的AABB,而后将AABB转换到Light Sapce,失去新的 Orthogonal Light Space ABB。而后咱们将物体的深度渲染到一张Shadowmap中。 咱们将Light Sapce的AABB沿着光照方向进行缩短,就失去了一个Shadow Volume。 接下来咱们就能够应用这个Shadow Volume来失去投射暗影了。将Shadow Volume作为几何体进行渲染,在Shader中读取以后地位的Depth值,反算出世界坐标,再通过投影矩阵算出光照空间下的深度值,在Shadowmap中进行采样,失去暗影。将最终输入后果的混合形式为DstColor Zero,这样,被遮挡区域有暗影的地位,色彩都这样乘以一个暗影系数,失去一个染色的成果,也就实现了Modulated shadow。 留神,为了避免在不须要暗影的区域渲染出暗影,咱们须要在代码中进行clip,如果计算出Shadowmap中对应的uv坐标超出0~1的范畴,就不再渲染暗影。在Unity中实现的Shader代码大抵如下: float4 frag (v2f i) : SV_Target{float2 uv = i.vertex.xy * (_ScreenParams.zw - 1);float depth = tex2D(_CameraDepthTexture, uv).r;#if !UNITY_REVERSED_Zdepth = depth * 2 - 1;#endif#if UNITY_REVERSED_Zuv.y = 1 - uv.y;#endiffloat4 clipPos = float4(2.0f * uv - 1.0f, depth, 1.0);////反算出世界空间坐标float4 worldSpacePos = mul(UNITY_MATRIX_I_VP, clipPos);worldSpacePos /= worldSpacePos.w;////失去shadowmap中uv坐标float4 projectorPos = mul(_WorldToProjector, worldSpacePos);#if UNITY_REVERSED_ZprojectorPos.z = clamp(projectorPos.z, 0.0001, 1);#elseprojectorPos.z = clamp(projectorPos.z, 0, 0.9999);#endif// uv不在0~1范畴内,不须要暗影clip(projectorPos.xy);clip(1 - projectorPos.xy);projectorPos.xy = projectorPos.xy * _ShadowmapTex_ST.xy + _ShadowmapTex_ST.zw;float shadow = SAMPLE_TEXTURE2D_SHADOW(_H3D_GroundShadowmapTex, sampler_H3D_GroundShadowmapTex, projectorPos.xyz).r;return shadow;}Modulated shadow有这样两个显著的毛病: ...

May 5, 2023 · 2 min · jiezi

关于计算机图形学:游戏开发中的渲染加速算法总结

提纲1、罕用空间数据结构 • 档次突围盒• BSP树• 八叉树• 场景图2、各种裁剪技术 • 反面裁剪• 视锥裁剪• 遮挡剔除• 档次视锥裁剪• 入口裁剪• 细节裁剪3、各种档次细节(LOD,Level of Detail)技术 · 几种LOD切换技术· 几种LOD选取技术4、大型模型的渲染5、点渲染 空间数据结构1、概念空间数据结构是将几何体组织在N维空间中的一系列数据结构2、利用场景治理、裁剪算法、相交测试、光线追踪、碰撞检测3、留神 · BSP树和八叉树(四叉树的三维推广)都是时机空间细分(将整个空间合成)的数据结构,他们将整个场景空间进行细分并编码到数据结构中。其中八叉树的划分是规定的,而BSP则大都是不规则的。· 档次突围盒不是空间细分构造(不须要笼罩整个场景),它仅将汇合物体四周的空间包围起来。【1】档次突围盒(Bounding Volume Hierarchies ,BVH)核心思想· 应用体积略大而几何特色简略的突围盒来近似的形容简单的几何对象,从而只须要对突围盒重叠的对象进行进一步的相交测试· 层层相套,单个物体能够作为子节点,多个蛋物体子节点造成一个多物体子节点,最初的根节点蕴含场景中所有的物体。如图所示: 【2】BSP树(二叉空间宰割树,Binary Space Partitioning)· 常用语判断对象可见性的数据结构,相似于画家算法,BSP能够不便的将外表由后往前地在屏幕上渲染进去,特地实用于场景中对象固定不变,仅视点挪动的状况。(补充为什么)· BSP树的构造方法补充。。。· 轴对齐BSP树 K-d树· 多边形对齐BSP树【3】八叉树· 概念:形容三维空间的树状数据结构,每个节点示意一个正方形的体积元素,每个节点分为八个字节点,这八个子节点所示意的体积元素相加等于父节点的体积,个别中心点作为节点的分叉核心。 【4】场景图(Scene Graphs)·概念组织和治理三维虚构场景的一种数据结构,是一个有向无环图,由一棵一深度优先遍从来渲染整个场景的树来示意。·开源的场景图Open Scene GraphOpenSG

October 19, 2020 · 1 min · jiezi

关于计算机图形学:高级着色BRDF及相关技术

提纲BRDF的前置常识:数学篇BRDF的前置常识:辐射度量学篇BRDF的定义与了解BRDF的性质BRDF的模型分类基于物理的BRDF前置常识【1】BRDFBidirectional Reflectance Distribution Function双向反射散布函数形容的是:物体外表将光能从任何一个入射方向反射到任何一个视点方向的反射个性,即入射光线通过某个外表反射后如何在各个出射方向上散布,单位是每球面度。BRDF模型是绝大多数图形学算法中用于形容光反射景象的根本模型【2】前置常识:数学篇 • 球面坐标 r: 示意向量的长度 :示意向量和Z轴的夹角 :示意向量在x-y立体的投影和x轴的逆时针夹角 • 立体角立体角形容了从原点向一个球面区域张成的视线大小,能够看成是弧度的三维扩张立体角度量三维角度,用符号示意,单位为平面弧度(也叫球面度,写为sr),等于立体角在单位球上对应的区域的面积1.首先了解二维立体的弧度: 圆心角的大小与弧长没有特定的关系,圆心角的掂量只有在单位圆上时才与弧长大小无关,比方一个同心圆,穿过两个大小不一的圆形时,对应的弧长不同,然而角度是雷同的,因而角度是形容张开的范畴。 2.立体角定义: 与圆心角雷同,掂量立体角应以单位球为根底,形容的在单位球上面积张开的大小,他的形态能够很多样化,他是形容这块投影面积占整个单位球面面积的比例大小。当这个所占比例雷同时,则立体角雷同(形态能够不同)因而,所有立体角能够拼凑为一个球的外表,各个立体角所对应的面积块能够大小不一,形态怪异【3】前置常识:辐射度量学篇 【4】BRDF的定义与了解 • BRDF的定义式定义:BRDF是用来形容外表如何反射光线的方程,即形容光如何从给定的两个方向(入射光方向l和出射方向v)在外表进行反射的函数。示意:出射辐射率的微分和入射辐照度的微分之比:∫(1,v)=(dL_0 (v))/(dE(l))当光源为非区域光源时,如点光源或方向光源,这种状况下BRDF能够用非微分的模式表白 • BRDF能够用n个非区域光源来拟合着色方程【5】BRDF的模型分类• 可逆性交互入射光和反射光,并不会扭转BRDF的值• 能量守恒性质【6】BRDF的分类教训模型: 定义:应用基于试验提出的公式对BRDF做疾速预计 • Phone模型 • Lambert模型 • Bling-Phone模型 • 疾速Phone模型 • 可逆Phone模型 数据驱动模型: 定义:采集真是资料外表在不同光照角度和察看角将BRDF依照实测数据建设查找表,记录在数据库中,以便于疾速的查找和计算。 该办法因为采样点密集,数据量宏大,因而适宜离线渲染不适宜实时渲染基于物理的BRDF模型: 定义:通过蕴含材质的各种汇合及光学性质来尽可能准确的近似事实世界中的资料。 • 必须满足两个个性 一:能量守恒(出射的光洁不能大于入射的光洁) 二:可逆性(你在注视深渊,深渊也在注视你,亮度比例雷同,但不肯定亮度雷同) • 基于物理的渲染(PBR)是用数学建模的办法模仿物体外表各种材质散射光线的属性从而渲染照片帧是图片的技术。 • Cook-Torrance BRDF 模型(微立体着色模型,基于物理着色的规范模型之一) 微立体:立体不止一个法线,其实应该有很多法线,此时不应思考各个方向上的法线比例。 • Ward BRDF 模型【7】菲涅尔反射(Fresnel Reflectance)定义:是一组用于形容光在两种不同折射率的介质中流传时的反射和折射的光学方程 。即当光入射到折射率不同的两个材质的分界面时(如水和空气),一部分光会被反射,而咱们所看到的光线会依据咱们的察看角度以不同强度反射的景象。除了金属之外,其余物质均有不同水平的菲涅尔反射成果。 • 眼帘垂直于外表时,反射较弱,而过后先并非垂直外表时,夹角越小,反射越显著。 • 影响菲涅尔效应的要害参数是(1)每个微立体的法向量(2)入射光线的角度,因而咱们在宏观层面看到的实际上是微立体的菲涅尔效应的一个均匀后果。举例:从水池垂直向下看能够看到池底,但如果从靠近平行于水面的方向看上来则看不到池底。【8】法线散布函数(Normal Distribution Function,NDF)定义:D(h)来形容组成外表一点的所有微立体的法线散布概率。即向NDF输出一个朝向h,NDF会返回朝向是h的为外表数占微外表总数的比例,比方有8%的微外表朝向是h,则有8%的微外表可能将光线反射到v方向。次外表散射和漫反射是一样的。不同之处在于光线在被排汇或流传回去之前能够在外表之下的扩散距离. ...

October 19, 2020 · 1 min · jiezi