Real-Time Rendering 4th Edition 读书笔记(四) 5.Shading Basics

5.Shading Basics

 

5.1Shading Models

其实就是多次差值计算的使用,就是CG语言中的lerp函数.

 dot对两个单位向量使用的结果是获得两个向量的夹角的cos值.

其中的n,l,都是单位向量, dot(n,l)求得cos值,因为l的大小为1,所以在n上面的投影值为就是cos值, 而 l + r 所得到的向量方向与n方向一样,大小为2Cos.

 

5.2 Light Sources

采用有密度的射线来模拟光线,之前比较疑惑的是为什么光的方向向量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 Implementing Shading Models

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

为了保持信号的缩放不变,滤波器的峰值是1.

Box Filter: 重构结果不是连续的,效果较差,但是简单.

Tent Filter:重构结果是连续的,效果较好,但是不够圆滑

Sinc Filter:

采用低通滤波器(low-pass 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 Transparency, Alpha, and Compositing

5.5.1 Blending Order

这个就是在unity shader中用到的混合命令 blend SrcAlpha OneMinusScrAlpha

透明类物体的渲染队列是要在不透明的物体之后,才能得到正确的结果.

additinve blending:

一般的透明物体的渲染过程是不进行深度写入的,所以会出现左边的错误情况,因为没有深度信息,所以虽然是透明的但是感觉不到透明物本身的前后关系.而右边是效果表现不错是因为增加了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)

5.6 Display Encoding

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.

发布了23 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Vitens/article/details/82595911