GAMES101 学习7——着色(光照与基本着色模型)

举报
lutianfei 发表于 2022/05/06 10:55:45 2022/05/06
【摘要】 参考资料:https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/3d0ceb949b4f142afd94f12b88569319#Y383Rhttps://blog.csdn.net/qq_36242312/article/details/105738935 一、可见性/遮挡(上节遗留) 1.1 画家算法(油画)先画远处,再画近处,遮挡住远处 1...

参考资料:
https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/3d0ceb949b4f142afd94f12b88569319#Y383R
https://blog.csdn.net/qq_36242312/article/details/105738935

一、可见性/遮挡(上节遗留)

上一篇文章说了如何光栅化三角形,当在屏幕上画好了三角形后,我们要确定物体与物体之间的遮挡关系,而这种方法通常使用的是Z-buffering(深度缓冲)

1.1 画家算法(油画)

画家算法是一种比较简单的计算遮挡的算法。它把需要画的物体按深度大小的顺序进行排序,然后按由远到近的顺序依次画物体。在出现遮挡时,只需要把遮挡物体直接画在遮挡处即可,所以它会不断的覆盖之前绘制的物体。

即:先画远处,再画近处,遮挡住远处
image.png

但是这种算法会出现无法解决的深度顺序问题,因为它是按照绘制的多边形的深度进行排序,如下图:
image.png

1.2 Z-Buffer深度缓冲

Z-buffering相较画家算法而言更加适用,因为它是按像素的深度大小进行排序。
它的主要思想如下:
为每一个像素存储当前的最小深度值(这里课程指的是深度越小,离视点越近,如果z轴的远近定义不一样,则会存储最大深度值),当扫描到新的像素,如果它的深度更小,则用它对应或插值的颜色值来替代当前需要显示的颜色值。

思路如下:

  1. 记录当前像素的最浅深度
  2. 需要一个额外的buffer来放深度值
    • Frame buffer stores color values
    • depth buffer(z buffer)stores depth

注意:

  1. 这里为了简化概念,这里针对深度这个概念z轴是正的(近处z小,远处z大)
  2. 对于深度的理解:离摄像机越近深度越小,越远深度越大
  3. 越近越黑,越远越白(参考美术的颜色值:0-1对应黑到白)

image.png

流程图如下:
image.png

例子:
image.png
重点:小的(近的)遮住大的(远的)
具体操作:

  • 小的→更新
  • 大的→不变
  • 一样→待定(z-fight:深度冲突,从别的地方再去了解)

1.3 Z-Buffer复杂度分析

  1. 为什么不是O(nlog)(排序的最小复杂度)而是O(n)
    因为不是排序算法,只是对每个像素求最小值

  2. Z-Buffer算法和顺序无关(不考虑深度相同的情况)

二、Shading(着色)

shading的字面意思就是通过对物体进行上色
对于本门课程来说:shading的定义是对物体应用材质的过程。
而材质可以理解成物体自身对光线的各种反应情况,它反应了物体本身的物理属性。

三、 Blinn-Phong Reflectance Model(Blinn-Phong 光照模型)

感性认识:一个物体上可以分为三部分:高光、漫反射、环境光照
image.png

一些基本概念

  1. 观测方向v,法线n,光照方向l
    image.png

  2. Shading是一个local概念, 即只考虑这个点的着色情况,不考虑其他的。(例如:点在阴影里)

3.1 Diffuse Reflection漫反射概念

3.1.1 什么是漫反射

光会被均匀的反射到不同的方向,是模拟光源对物体的方向性影响,所以它是独立于视线的,图中方程也没有和视线相关的参数。 I / r 2 I / r^{2} 表示光的衰减情况, max ( 0 , n l ) \max (0, \mathbf{n} \cdot \mathbf{l}) 计算的是0和 法向量与光照向量的较大值, 因为当光照向量与法向量夹角大于90°时,其结果会为负,没有意义,而 k d k_{d} 可以看做是漫反射系数,当像素有颜色时,它是像素的颜色值,当像素有纹理时,它可以是像素的纹理值(实际上还是纹理的颜色值)

3.1.2 Lambert余弦定律

  • 结论一:n和l的夹角决定了明暗(即物体接收到的光照能量和n、l夹角的余弦成正比)
    image.png
  • 结论二:光的衰减关系
    image.png

公式表示
image.png
说明:

  • max的意义:cos为负时无意义
  • 漫反射系数kd 引申一下颜色是怎么来的:接收的光分为:吸收的 和 反射的→产生颜色(1为全反射=白; 0为全吸收=黑)表示为一个vector→RGB三通道→定义一个颜色
  • 整体公式可知和v无关→和观察方向无关
  • 只是一个经验模型,与实际物理有差异

image.png

3.2 Specular Term高光项

高光用来模拟有光泽物体上面出现的亮点,它是依赖于观察方向的,当视线与光照向量的半程向量与法向量夹角越大时,高光影响越小,当夹角越小时,影响越大。可以这样想象,我们需要看的是一块镜面的反射,当我们的视线与光照向量恰好对称时,高光越强。 k d k_{d} 为高光系数,h为半程向量,这里用半程向量的好处主要是用于解决视线与光照向量在同一侧,从而引起的光断层现象

image.png

3.2.1 半程向量

image.png

c. 说明

  • ks为什么是白色→因为是经验性模型,是简化之后的
  • 为什么 n \vec n h \vec h 不用反射方向:因为好算(用反射方向的话就是:phong模型)
  • “p次方的作用”:控制高光多大
    image.png

image.png

3.3 Ambient Term环境光照

用来模拟即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的这种情况。

image.png

说明:

  • 环境光和l n v 都没关系 →就是一个常数→一个颜色
  • 是近似/假设的

3.4 总体概括Blinn-Phong模型

image.png

四、光照规则补充

计算光照的一些简单规则:

  1. 物体颜色:我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的颜色。如果想知道物体的颜色,只需要用它的颜色和光的颜色进行逐元素乘即可。

比如下面的例子,光照颜色是绿色,通过用物体颜色和光照颜色进行逐元素乘,发现最后物体吸收了一半的绿色,并且以另一半为结果反射给人眼,所以我们看到的结果应该是暗绿色的物体

vec3 lightColor(0.0f, 1.0f, 0.0f);
vec3 objectColor(1.0f, 0.5f, 0.31f);
vec3 lightResult = lightColor * objectColor; // = (0.0f, 0.5f, 0.0f);
  1. 利用点乘计算光照影响:漫反射表示光会朝不同的方向进行反射,为了计算光对物体表面的影响,我们只需要光和物体表面法向量进行点乘即可,想想看一束光如果直接垂直打在物体上,其影响是最大的
    image.png

  2. 光的衰减:光照强度会随着距离衰减,注意衰减范围是以光源为中心的圆展开的

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。