其实就是多次差值计算的使用,就是CG语言中的lerp函数.
dot对两个单位向量使用的结果是获得两个向量的夹角的cos值.
其中的n,l,都是单位向量, dot(n,l)求得cos值,因为l的大小为1,所以在n上面的投影值为就是cos值, 而 l + r 所得到的向量方向与n方向一样,大小为2Cos.
采用有密度的射线来模拟光线,之前比较疑惑的是为什么光的方向向量L是从物体的表面指向光源(就是和光的路径相反),这里也说到了原来是为了方便计算,否则的话每次在计算dot(N,L)之前都需要将L向量加个负号.
dot值为正,表示光能照射到的表面,而且值越大照射角度和法线角度越小,强度越大
dot值为负,表示光照射到的是背面,对渲染效果无影响,需要舍弃掉.所以dot值需要clam到0-1.
5.2.1 Directional Lights
方向光的方向和颜色都是固定的,且没有位置信息.
5.2.2 Punctual Lights
punctus是拉丁语中的"point"的意思,点光源和聚光灯就是它的两种表现形式.
Punctual Lights有位置信息,方向就是物体表面上的点指向光源位置.
一个向量v的长度计算: length = square(dot(v,v))
其中的r就表示距离,可以用来求光强度的衰减.
Point/Omni Lights
实际使用中可能有些问题,比如r特别小的时候,或者r=0,所以修改版本是将除数 r 加上一个常量(UE中的值是1cm) 如:
或者是将r的最小值做个限制,如:
Frostbite Engine 和 UE 使用的:(这里的+2表示括号结果先clam到正数,然后在求平方)
其他:
Spotlights
-L : 光源位置指向被照射物体表面的点
S : 聚光灯方向
θu : umbra angle 本影角
θp : penumbra angle 半影角
5.3.1 Frequency of Evaluation
• Vertex shader|Evaluation per pre-tessellation vertex.
• Hull shader|Evaluation per surface patch.
• Domain shader|Evaluation per post-tessellation vertex.
• Geometry shader|Evaluation per primitive.
• Pixel shader|Evaluation per pixel.
逐顶点的shader在模型面数很低的情况下,光照的效果就会出现明显的破绽,高模就会好一些,逐像素的处理就会好很多.
大多数时候,VertexShader的职责是进行几何变换与形变操作,然后将结果信息通过线性插值的手段传递给像素shader.
如上图所示,线性插值的过程会影响到法线,所以像素shader中需要对法线重新归一化处理.并且VertexShader中也需要归一化处理发现,否则插值后的结果就会想长的一边歪曲.
5.11说明了光照方向在vertexShader中如果被归一化然后通过线性插值传递给PixelShader,就会出错.
5.4 Aliasing and Antialiasing 走样和抗锯齿
渲染结果的锯齿(the jaggies),更正式的叫走样(Aliasing),消除这个效果的操作较抗锯齿(反走样)(Antialiasing).
5.4.1 Sampling and Filtering Theory
渲染图片本质就是一个采样的过程.
Nyquist rate/limit:采样频率必须大于信号的最大频率的两倍.
Reconstruction
Box Filter: 重构结果不是连续的,效果较差,但是简单.
Tent Filter:重构结果是连续的,效果较好,但是不够圆滑
Sinc Filter:
Resampling
重采样用于对信号的放大与缩小.
Magnification(upsampling):超采样 如果重构结果已经不错了,超采样对结果没什么影响不过采样间隔变小了(采样次数多了).
minification(downsampling):降采样
5.4.2 Screen-Based Antialiasing
基于屏幕的抗锯齿算法暂时没有一个是最优的,都各有所长,看具体需求来使用.
这里表现了每个像素点上一次采样与四次采样的区别,显然后者的表现效果会更优.
supersampling (oversampling) 指的是每个像素超过一次的采样计算.
FSAA(full-scene antialiasing) or SSAA(supersampling antialiasing) 全屏抗锯齿
MSAA(Multisampling antialiasing)
CFAA(custom filter antialiasing)
MFAA(multi-frame antialiasing)
TAA(temporal antialiasing)
Sampling Patterns
采样的样式是非常关键的.
RGSS(Rotated grid supersampling)
5.27图中直观的看出了N-rooks sampling的局限性.
GPU的生产商已经提供了上面这几种MSAA的硬件支持,可供开发者选择.
FLIPQUAD的方式,采样点在边缘处,相邻的像素点可共享采样点.
Morphological Methods
走样经常在发生在边缘,比如几何边缘,影子的边缘,高光的边缘.
MLAA(morphological antialiasing),思想是基于后处理,
SRAA(subpixel reconstruction antialiasing)
GBAA(geometry buffer antialiasing)
DEAA(distance-to-edge antialiasing)
DLAA(directionally localized antialiasing)
FXAA(fast approximate antialiasing)
SMAA(subpixel morphological antialiasing)
5.5.1 Blending Order
这个就是在unity shader中用到的混合命令 blend SrcAlpha OneMinusScrAlpha
透明类物体的渲染队列是要在不透明的物体之后,才能得到正确的结果.
一般的透明物体的渲染过程是不进行深度写入的,所以会出现左边的错误情况,因为没有深度信息,所以虽然是透明的但是感觉不到透明物本身的前后关系.而右边是效果表现不错是因为增加了pass通道拿到自己的深度信息.增加了开销.
5.5.2 Order-Independent Transparency
weighted average transparency:加权平均透明度
5.53 Premultiplied Alphas and Compositing
支持Alpha通道的图片格式:
PNG(unassociated alpha only)
OpenEXR(associated only)
TIFF(both types of alpha)
gamma correction 伽马矫正
Take shader output colors in the range [0; 1] and raise them by a power of 1=2:2, performing what is called gamma correction.