目录第18章 基于物理的渲染18.1 PBS的理论和数学基础18.2 Unity5的Shandard Shader18.3 一个更复杂的例子18.4 答疑解惑第19章Unity5更新了什么19.1 场景更亮了19.2 表面着色器更容易报错了19.3 当家做主自己控制非统一缩放的网络19.4 固定管线着色器逐渐退出舞台第20章 还有更多内容吗第18章 基于物理的渲染·基于物理的渲染技术PBS是为了对光和材质之间的行为进行更加真实的建模·使用了基于物理的光照模型的Standard Shader可在不同材质之间通用。18.1 PBS的理论和数学基础光是什么·光在传播时介质的折射率发生了变化光的传播方向就会发生变化折射率是突变的就会发生光的散射现象。·渲染中只考虑两个介质的边界是无限大并且是光学平滑的在此前提下光在不同介质的边界会被分割成两个方向——折射、反射有多少百分比的光会被反射由菲涅尔等式来描述。·物体的表面存在很多肉眼不可见的凹凸不平的平面和光照发生的各种行为更像是一系列微小的光学平滑平面和光交互的结果平滑物体的微表面法线方向变化小反射光线的方向变化也比较小。·金属材质具有很高的吸收系数因此所有被折射的光往往会被立刻吸收非金属材质会同时表现吸收和散射散射出去的光被称为次表面散射光。·渲染的层级大小上考虑次表面散射光会从不同于入射点的位置从物体内部再次射出若像素大于散射距离则可以被忽略反之则不可以需使用特殊的渲染模型来实现更真实的次表面散射效果则为次表面散射渲染技术。·以下内容建立在不考虑次表面散射的距离完全使用局部着色渲染的前提。双向反射分布函数BRDF·辐射率单位面积、单位方向上光源的辐射通量L被认为是单一光线的亮度和颜色评估·着色基于表面的入射光线的入射辐射率来计算出射辐射率。·BRDF可以用f(l, v)来表示l为入射方向v为观察方向各向同性的BRDF中绕着表面法线旋转入射方向或观察方向并不会影响BRDF的结果反之则是各向异性。·BRDF的两种理解方式给定入射角度后给出所有出射方向上的反射和散射光线的相对分布情况给出从所有入射方向到该出射方向的光线分布更直观的理解沿入射方向到达某点时表示能有多少部分的能量被反射到了观察方向上。·反射等式公式略给定观察视角该方向上出射辐射率等于所有入射方向的辐射率积分乘以BRDF值再乘以余弦值即已知该点的观察方向出射辐射率是由许多不同方向的入射辐射率叠加后的结果BRDF表示不同方向的入射光在该观察方向上的权重分布余弦值表示在该表面的投影结果积分即把值加起来。·精确光源方向确定大小无限小使用特定的BRDF值来代替积分操作多个精确光源则相加。·BRDF决定了着色过程是否属于物理的看是否满足两个特性是否满足交换率lv交换后值不变和能量守恒表面反射的能量不能超过入射。·BRDF用于描述表面反射的部分被称为高光反射项用于描述次表面散射的为漫反射项。漫反射项·Lambert是最简单且广泛使用的漫反射BRDF公式为c/πc表示漫反射光线占的比例该式子是定值余弦因子实际是反射等式的一部分而非BRDF的除以π是因为假设漫反射在所有方向上强度都是相同的BRDF要求半球内积分值为1。·Disney的BRDF[2]公式略使用了更复杂的漫反射项。高光反射项·在基于物理的渲染中大多数建立在微面元理论物体表面实际是由许多人眼看不到的微面元组成微面元可以被认为是光学平滑的具有完美的高光反射的假设上只需要考虑被反射的光线。·不被遮挡的且微面元法线m半角度矢量h的微面元反射才会被添加到BRDF的计算中。·基于以上假设高光反射项可表示为F(l, h) G(l, v, h) D(h) / 4(n, l)(n, v)即Torrance-Sparrow微面元模型D(h)是法线分布函数用于计算多少比例的微面元满足m hG(l, v, h)是阴影-遮掩函数给出了活跃的微面元所占的浓度F(l, h)为活跃微面元的菲涅尔反射函数表示反射光线占入射光线的比率4(n, l)(n, v)是用于矫正从微面元的局部空间到整体宏观表面数量差异的矫正因子。Unity中的PBS实现·受Disney的BRDF[2]启发直观、万能。·一共实现了两种PBS模型基于GGX模型的、基于归一化的Blinn-Phong模型的使用了不同的公式计算D(h)和G(l, v, h)。18.2 Unity5的Shandard Shader·使用了基于物理的渲染。·两种基于物理的工作流程金属工作流默认的工作流程对应Standard Shader名字来源于其定义了材质表面的金属值和高光反射工作流对应Standard Specular setup名字来源于可以直接指定表面的高光反射颜色只是使用的参数不同。它们是如何实现的·依赖的头文件略可查看Standard.shader和StandardSpecular.shader来查看二者如何实现基于物理的渲染。·前者计算复杂针对非移动平台定义了前向渲染路径和延迟渲染路径使用的Pass以及用于投射阴影和提取元数据的Pass后者两个Pass用于前向渲染路径一个用于投射阴影另一个用于提取元数据针对移动平台二者最大的不同在于设置BRDF的输入时使用不同的函数。如何使用Standard Shader·金属材质几乎没有漫反射因为所有被吸收的光都会被自由电子立刻转化为其他形式的能量有非常强烈的高光反射高光反射通常有颜色·非金属材质大多数角度的高光反射强度弱掠射角时高光反射强度增强即菲涅尔现象高光反射的颜色单一漫反射的颜色多种多样·真实的材质往往融合二者。·Unity的校准表格金属工作流中材质面板的Albedo定义了物体的整体颜色通常是视觉上认为的物体颜色Metallic定义了该物体表面看起来是否更像金属或非金属使用纹理来采样得到该值时R通道对应该值金属材质的该值为1Smoothness是上一个值的附属值定义了从视觉上来看该表面的光滑程度对应纹理的A通道。高光反射工作流只是使用了不同含义的Albedo属性表示漫反射强度并使用Specular代替了上述的Metallic属性定义了表面的高光反射强度。上述材质属性都属于材质面板中的Main Maps部分下面的Secondary Maps用来定义额外细节。还可以通过Render Mode选择渲染模式。默认Opaque渲染不透明物体Transparent下Albedo的A通道用于控制材质透明度Cutout下A通道为掩码纹理子属性Alpha Cutoff是透明度测试时使用的阈值Fade和Transparent类似但透明度降低时所有渲染效果都会淡出。18.3 一个更复杂的例子暂略18.4 答疑解惑什么是全局光照·指的是模拟光线是如何在场景中传播的不仅会考虑直接光照的结果还会计算光线被不同的物体表面反射的间接光照非常耗时间通常不用于实时渲染传统方法是使用光线追踪不能满足实时需求。·Enlighten解决方案——实时预计算实时光照用于计算直接光源对场景的影响预计算使全局光照在高端移动设备上也能达到实时的要求·预计算光照包含了常见的光照烘焙但烘焙得的纹理是静态的。·预计算实时全局光照动态地为场景实时更新复杂的光照结果利用了一个事实——一旦物体和光源的位置被固定了物体对光线的反弹路径以及漫反射光照也是固定的和摄像机无关因此可以用预计算方法吧物体之间关系提前计算出来只要光源的位置不变信息就一直有效·一个例外高光反射使用反射探针来模拟光照环境。什么是伽马矫正·把伽马空间转换到线性空间伽马一词来源于伽马曲线表达式略计算的指数部分即为伽马。·最开始的时候使用伽马曲线来对拍摄的图像进行伽马编码亮度上的线性变化对人眼感知来说是非均匀的应该把更多的空间用于存储更多的暗部区域图片放到显示器里显示时再进行一次解码操作CRT显示器几乎自动做了这个操作使用的伽马曲线为显示伽马·由于上述存在可能一不小心就在非线性空间下进行计算使得输出的图像是非线性的·伽马的存在还会对混合造成影响。·渲染中非线性输入最有可能的来源就是纹理在使用多级渐远纹理线性计算时也需要注意要把非线性的纹理转换到线性空间再进行计算·游戏渲染中选择线性空间时Unity会把输入纹理设置成sRGB模式硬件对纹理进行采样时会自动将其转换到线性空间中GPU进行伽马校正·如果开启HDR就会使用一个浮点精度的缓冲有充足的精度不需要进行伽马校正所有的混合和屏幕后处理都是在线性空间下进行的渲染完成要写入显示设备的后备缓冲区时再进行最后一次伽马校正否则写入缓冲前要进行伽马校正读取缓冲时再进行一次解码开启了混合则需把颜色缓冲中存储的颜色值转换到颜色缓冲中透明通道不参与伽马校正·移动平台用不了线性空间需要在自己的Shader中进行伽马校正但会导致写入的颜色是非线性的会在混合时出现问题需要保证伽马校正发生在渲染的最后一步。什么是HDR·高动态范围High Dynamic RangeHDR低动态范围LDR动态范围指的是最高和最低亮度值之间的比值HDR使用远远高于8位的精度来记录亮度信息从而可以更加精确地反映真实的光照环境但最后还是需要把信息转换到显示设备使用的LDR内·使用HDR来存储的图像为高动态范围图像HDRI可以更加真实地反映物体周围的环境从而得到更加真实的反射效果还可以保留亮度超过1的光照结果使用色调映射技术来控制转换到LDR的过程从而允许最大限度地保留亮度细节·常常同时使用HDR和Bloom效果使用超过1的阈值来只提取非常亮的区域·HDR缺点需要更大的显存空间渲染速度会变慢且一些硬件不支持HDR使用HDR后无法再利用硬件的抗锯齿功能可以使用基于屏幕后处理的抗锯齿操作来弥补。那么PBS适合什么样的游戏·PBS优点只需要一个万能的Shader就可以渲染大部分类型的材质同时可以保证在各种光照条件下材质都可以自然地与光源进行交互·PBS代价需要更复杂的光照配合如光照探针和反射探针也需要开启HDR以及一些必不可少的屏幕特效。第19章Unity5更新了什么考虑到现在Unity迭代这里不作详细的记录。19.1 场景更亮了·Shader不再需要在光照结果的最后乘以系数2来解决画面暗的问题。19.2 表面着色器更容易报错了·报错通常是指Shader中的数学指令或插值寄存器的数目超过了限制并提示需要使用更高的Shader Model这些是因为表面着色器在背后进行了更多的计算·新添加的计算和插值寄存器通常是为了计算阴影、雾效、非统一缩放模型的法线变换矩阵·解决方法使用更高的Shader Model或减少表面着色器背后的计算编译指令来实现。19.3 当家做主自己控制非统一缩放的网络·直接将原顶点信息和包含非统一缩放的矩阵传递给Shader需要在变换顶点法线时时刻小心非统一缩放的影响并进行手动归一化。19.4 固定管线着色器逐渐退出舞台略第20章 还有更多内容吗本章内容大部分为推荐的学习资料故略