zoukankan      html  css  js  c++  java
  • Shader笔记——1.光照基础

    3D引擎中的基础光照

    折射与反射

    光源发射出光线,然后光线与物体相交发生散射和吸收,散射的光线经过折射和反射进入摄像机,由此便产生图像。

    光源LightSource

    • 光源的光线方向:l
    • 量化:irradiance 辐照度(计算平行光在垂直于l的单位面积上单位时间内穿过的能量)

    光与物体相交发生散射与吸收

    • 散射:只会改变光线的方向,不改变光线的密度和颜色
    • 吸收:只改变光线的密度和颜色,不改变光线的方向

    散射又可以分为折射与反射

    • 散射到物体内部,称为投射(Transmission)或者折射(Refraction)

    • 散射到外部,称为反射(Reflection)

    在光照模型中我们使用不同的部分来区分并计算散射的这两种不同方向

    • 漫反射diffuse:表示有多少光线会被吸收、折射、射出表面(可以计算出光线的数量、方向、出射度,出射度与辐照度之间满足线性关系)
    • 高光反射specular:表示物体表面是如何反射光线的

    标准光照模型

    1975年,著名学者裴祥风提出了标准光照模型的基本理念,标准光照模型只关心直接光照DirectLight,即直接从光源发射照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线,其基本方法是将进入摄像机的光线分为4部分,分别计算每一部分的贡献度,这4部分分别是:

    • 自发光Emissive,使用cemissive表示,来描述一个表面自身会向该方向发射多少辐射量
    • 环境光Ambient,使用cambient来表示,描述其他所有的间接光照
    • 漫反射Diffuse,使用cdiffuse表示,描述光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量
    • 高光反射Specular,使用cspecular表示,描述光线从光源到模型表面时,该表面会完全镜面反射多少辐射量

    自发光

    使用cemissive来表示,用于描述给定一个视角方向,自发光物体表面本身在不经过任何物体反射的情况下会向该方向发射多少辐射量

    计算公式为:cemissive = memissive
    (直接使用该材质的自发光颜色,需要注意:在不使用全局光照Global illumination时,自发光的物体表面并不会照亮周围物体,只会表现出本身表面比较亮)

    环境光

    在标准光照模型中,使用环境光来模拟间接光照Indirect Light(即物体被反射过来的光线间接照亮之后进入摄像机),环境光通常是一个全局变量,即场景中所有的物体都是用这个环境光,计算公式为:

    cambient = gambient

    漫反射

    漫反射光照是用于对被物体表面随机散射到各个方向的辐照度进行建模的,因为是随机向各个方向反射的,所以在漫反射中,摄像机的视线方向并不重要。但是光线的入射光线的反向则非常重要。

    (注意区分光源方向I和光源发射的光线方向l)

    Blinn.PNG

    Lambert光照模型

    漫反射光照符合兰伯特定律(lambert's law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。因此,漫反射部分的计算公式如下:

    cdiffuse = (clight · mdiffuse)max(0,n·I)

    • 光源颜色clight,材质的漫反射颜色mdiffuse,指向光源的单位矢量I,物体表面法线n
    • 反射光线的强度余表面表面法线n和光源方向l直接的夹角余弦值成正比,即: n·l ,为了防止法线n和光源方向l点乘的结果为负值,多以使用最大值函数将点乘值截取到0,来防止物体被来自背后的光线照亮,max(0,n·l)

    半兰伯特光照模型

    上面使用的漫反射光照模型被称为兰伯特光照模型,即符合兰伯特定律。使用兰伯特光照模型会导致模型的背光面(光线无法到达的位置全黑)没有任何明暗变化。此时,我们可以使用半兰伯特光照模型来改善这一问题。
    广义的半兰伯特光照模型在兰伯特光照模型上进行了简单修改,并没有使用 max 操作来防止法线方向n与光源方向l之间点乘结果为负值,而是采用了一个a倍的缩放加上b倍的偏移,公式如下:

    cdiffuse = (clight mdiffuse)(a*(n·I)+b)

    通常情况下,缩放值a以及偏移值b都为0.5,即半兰伯特,公式为:

    cdiffuse = (clight mdiffuse)(0.5*(n·I)+0.5)

    高光反射

    标准光照模型中的高光反射是一种经验模型,即并不完全符合真实世界中的高光反射现象,主要用于计算那些沿着完全镜面反射被反射的光线,来使物体看起来有光泽。

    Phong光照模型

    计算高光反射时使用Phong光照模型来计算高光反射的部分,计算高光反射时我们需要表面法线n,视角方向v,光源方向I,反射方向r等信息

    (注意区分光源方向I和光源发射的光线方向l)

    specular.PNG

    其中,反射方向r,我们可以通过其他三个矢量计算得出:

    r = 2(n·I)n - I

    高光反射利用Phong模型来计算的公式为:

    cspecular = (clight · mspecular)max(0,v·r)mgloss

    • 光源的颜色和强度clight,材质的高光反射颜色和强度mspecular,防止向量v点乘向量r为负数max(0,v·r),光泽度mgloss(也称为反光度)mgloss值越大,高光反射的亮点就越小

    Blinn光照模型

    和Phong模型相比,Blinn模型避免计算光线的反射方向r,而引入了一个新的矢量h,该矢量通过对视角方向v和光源方向I进行归一化之后得到,即:
    h = (v + I)/|v + I|

    specular.PNG

    得到矢量h之后,通过n和h之间的夹角来进行计算,且计算结果更符合实验结果。

    Blinn模型的公式:

    cspecular = (clight · mspecular)max(0,n ·h)mgloss

    Blinn-Phong光照模型

    标准光照模型是由裴祥风首先提出基于经验的计算高光反射的方法以及使用漫反射和高光反射的和来对反射光照进行建模,因此,标准光照模型又被称之为Phong光照模型。在此之后,由于Blinn提出了简化计算的方法,这种模型称为Blinn-Phong光照模型。

    Blinn-Phong光照模型的缺点:

    • 很多重要的物理现象无法用Blinn-Phong模型表现出来,例如菲涅尔反射(Fresnel reflection)
    • Blinn-Phong模型是各项同性(iostropic)的,即在固定视角方向v和光源方向I时旋转物体表面,反射的效果并不会发生改变,因此,具有各向异性(aniostropic)反射性质的物体表面例如金属拉丝、毛发等

    逐顶点与逐像素

    • 当我们在顶点着色器中进行光照模型的计算时,称为逐顶点光照(per-vertex lighting)
    • 在片元着色器中进行光照模型的计算时,称为逐像素光照(per-pixel lighting)以每个像素为基础,得到该像素点的法线(可以通过对顶点法线差值得到或者对法线纹理中采样得到),然后进行光照模型的计算

    REF

    书籍:

    OpenGL超级宝典、UnityShader入门

    博客:

    https://blog.csdn.net/hcud024/article/details/51360099

  • 相关阅读:
    linux 查看磁盘空间大小
    linux查看防火墙状态及开启关闭命令
    运行安装mysql 报错 [root@localhost mysql-mult]# ./scripts/mysql_install_db  --defaults-file=conf/3306my.cnf FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_
    linux lsof命令详解
    centos6下无法使用lsof命令"-bash: lsof: command not found"
    服务器创建好后怎样使用远程连接工具链接的一些问题
    mysql在linux下的安装
    jmeter-linux下运行
    【WPF】一组CheckBox的全选/全不选功能
    【WPF】TabControl垂直分页栏/选项卡
  • 原文地址:https://www.cnblogs.com/sylvan/p/9251446.html
Copyright © 2011-2022 走看看