我的专栏目录:
小IVan:专题概述及目录章节概述:
作为一个美术,一般遇到渲染管线上的问题的时候往往会束手无策,因为整个c++层到shader层这么大一块的系统都是由图形程序大佬一手搭建起来的。这就会导致平凡地需要去打扰别人。为了加快工作效率,我觉得美术有必要能自己完成整套渲染管线的搭建,优化和游戏跨平台发布。
这章将会从零开始,在虚幻4中搭建一个forward PBR渲染管线。内容大概会分为:理论推导,c++引擎底层渲染器搭建,shader层管线搭建和如何根据我们自己搭建的管线来定制美术资源开发文档及跨平台优化等一整套流程。
本篇章会写得非常通俗易懂,因为我是个美术,所以我觉得我写的东西应该大部分美术也都能看懂。
如有错误还请各路大神斧正,也欢迎大神留言和我一起讨论学习。
【1】数学工具基础
我们的终极目的就是用计算机画一张图出来,但是要如何画呢,计算机可只认识0和1,所以我们只能通过数学来描述。用公式来描述清楚光线是如何传播的,如何和物体作用的。我们需要一些数学工具来帮助我们度量光和物体表面的作用。
(1)圆心角
圆心角是弧度微分和半径的比值
![v2-21287f6b0564daed96d8ce11ffd898f6_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/e34f9fe73db152c43456be1a7e26aae5.png)
如果对【0,2π】积分的话,就变成了圆的周长2π。
(2)球面坐标
![v2-3918709d533880695eeb8fb391405e9d_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/3aa5f1e72d8bb6abc1e4032bc4628325.jpeg)
其中r表示向量的长度,θ表示向量和Z轴的夹角,Φ表示向量在x-y平面上的投影和x轴的逆时针夹角。
(3) 立体角
立体角与圆心角类似,立体角ds的含义就是球面上的面积微分和半径平方的比值
![v2-d0dfca8a2e8bac6883ce260ebe47d94c_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/23fe95cc1c7fa8c89d77934979216cf6.png)
1单位球面度即1dA的球面度对应的球面面基为r的平方。
因为球体表面积等于4πr^2 ,所以上面的式子积分到整个球体的话,立体角等于4π。所以对立体角进行半球积分可以得到为立体角的一半为2π(单位球)
由前面的球面坐标即可得到立体角的微分式为
(4)投影面积
![v2-4e437b03d2192ef4c00a964a5dabf726_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/efafafe220bcfb760b319f6f0763b00f.jpeg)
【2】辐射度量工具
有了上面的数学工具,下面我们就可以开始想办法度量物体表面的受光了。
下面是我从wiki上找到的一个表
![v2-0ec3225d1d59d17007a44196a39d0799_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/395a34fd5a4ffb11b2aba496bf857002.jpeg)
(1)辐射通量/光通量---用符号 表示
单位时间内(一帧)通过某一面积的所有电磁辐射(我们这里可以认为是光)总功率的度量。单位是瓦特
Q代表辐射能单位是焦耳
(2)辐射度---用符号 表示
单位表面出射及反射的辐射通量。对一个点(比如说点光源)来说,辐射强度表示每单位立体角的辐射通量。
(3)辐射率---用符号 表示
每单位立体角每单位投射表面的辐射通量。 表示物体表面沿某一方向的明亮程度,它等于每单位投影面积和单位立体角上的辐射通量,单位是W·sr−1·m−2,瓦特每球面度每平方米。在光学中,光源的辐射率,是描述非点光源时光源单位面积强度的物理量,定义为在指定方向上的单位立体角和垂直此方向的单位面积上的辐射通量。辐射率 也可以理解为辐射度
在表面dA上的积分。
(4)辐照度---用符号 表示
单位时间内入射表面的辐射通量。在游戏里的单位时间可认为是一帧。单位是 ,瓦特每平方米。辐照度还可以写成辐射率
在入射光形成的半球上的积分。
【3】光和物体表面的作用现象归纳整理分析
现在我们已经有了度量光照到物体表面的方法了,现在终于可以开始研究光和物体的作用了。
我们研究光和物体的作用肯定不能靠自己的想象,一切还是需要先基于现实。
![v2-c06ab0c7970501b875255e14e285bb6e_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/6afd6f89ba34fdab4e41f6c5dbf68b19.jpeg)
当光从太阳发射出来到达大气层之后,光被大气散射,所以把整个大气都照亮了(体积光,GI)。当太阳光照到山上,一部分光线被反射一部分光线被吸收。反射的这部分光射到水面上,一部分光线反射(高光),一部分吸收,一部分折射。水面反射光的分布是有规律的(菲尼尔因子)。最后这些光线再进入我们的眼睛。
通过对现实世界的分析,我们按照光线的传播路径把它们分一下类:反射光线,折射光线,散射光线,被吸收的光线,透射光线。
真实世界实在太复杂了,各种光线各种传播途径。于是光线追踪横空出世,通过光线的追踪渲染出图片,不过光线追踪计算量太大。于是我们只好对现实世界的光线进行简化,现在我们来把光线一条一条拆解分析。
当我们把光线通过传播路径来分类之后发现,光线数量还是很多,有必要再把它们归类,于是很容易想到,可以按照光照到不同的物质来再对光线进行分类,照到水上的光线,照到泥土上的光线,照到金属上的光线。现在我们有了一个二维的表。
![v2-8ade973cf33126be80117bbcb74bf07e_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/5eb34499b50b802e3cfd313588c2c791.jpeg)
物质类型在游戏里可以表示为 材质 这个概念。
用做实验时常用的控制变量法来讨论。
(1)当光路都是反射类型,物质类型不同时
物质如何分类呢,稍微背过元素周期表的都知道可以根据金属性来区分物质类型。于是可以把物体分为金属和非金属。定义:M,金属度
![v2-10cae054231b523ce8a48d8ffc28b3c3_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/a77032d35c3c01b77944476700a4dfa3.jpeg)
![v2-46b552ff96b5ef77326c01e3ae39e533_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/85585c5192b8556506a8b25d5e063fea.jpeg)
![v2-88ccf2ebb067c808473ea39c801b13ab_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/9e8ec60ea207767e4d3e10e5b4f3da75.jpeg)
当光线照到元素周期表靠左的主族元素和副族元素物质的时候(高金属度),由于元素比较活泼,所以光线如果进入物质内的话大部分会被吸收(就不考虑电子跃迁什么的了)。光线照到元素周期表偏右边的主族元素时则相反(低金属度),照进物体的部分光线还是可以被反射回去。
我们再对反射光线进行细分,则可以分为漫反射(上图反射光蓝色部分)和高光(上图反射光橙色部分)。
这时候还有个问题,我们上面两个视图所没有考虑到的,那就是表面十分光滑,然而世界上没有绝对光滑的物体(三体星人的水滴除外【手动滑稽】)。
物质的分类里面除了金属度会影响光线的反射外,还有物体表面的粗糙度也会影响,这个因素我们也应该纳入考虑范围。