zoukankan      html  css  js  c++  java
  • 进阶光照与材质之光照和反射模型

    第五章讲述了一些漫反射模型和镜面反射模型的原理和数学公式
    博主在unity中实现了一下,把部分结果贴在上面

    有下面几个主题:
    渲染公式
    基本光照定义
    光照和lambert法则
    双向反射分布函数BRDF
    漫反射材质原理简介与模型
    镜面反射材质原理简介与模型


    基本光照定义

    对于我们眼睛可见的光对于表面的作用,他们会发生,反射,穿透,折射,吸收,或者表面自发光。

    对于所有物体的光照基本公式如下


     如果表面不发光则EmittedLight为0。
    接下来会讨论许多种形式的反射函数reflectance Function

    irradiance辐照度:表面每单位面积接受到的所有能量(包括光能和其他能量)
    illuminance照度:表面每单位面积接受到的所有光能(只有光能)
    radiance辐射:表面每单位面积反射的的所有能量(包括光能和其他能量)
    luminance亮度:表面每单位面积反射的的所有光能(只有光能)
    不同的材质可能会反射不同数量的光为不同方向

    光照的lambert法则


    同等数量的光照射到的表面积越小,单位表面积受到的能量越多。
    当增加表面法线与入射角度增加时,受到光照的表面也增加,说明单位表面积收到的能量越少。
    当光照方向与表面法线垂直时,光线正好擦过表面,受到光照为0,但是自然界不可能出现这种状况,因为物体材质都是粗糙的,会受到其他表面反射光的照明。
    物体的Lambert漫反射可以用法线与入射角度的cos值表示,光照强度的范围在0-1.cos的范围为-1-1,必须把其限制在光照强度范围内,否则之后的计算会出现错误结果。
    公式如下
     
    光强IL是一个颜色值。在某些情况下,材质在不同的颜色通道有不同的反射行为。

    接下来要讲述的反射公式他们都有着微妙的不同,但都是同一种方式-BRDF。

    BRDF


    BRDF是描述入射光怎样反射为出射光的函数,用来求出出射光强,我们只关注进入眼睛的部分反射光。BRDF并不适合所有材质
    BRDF’有两个属性
    1.    他是双向的,意味着可以互换光照入射方向和出射方向,得到的结果是相同的
    2.    真正的BRDF服从能量守恒定律

    BRDF所需参数如下
     
    BRDF也依赖于波长。
    BRDF与着色模型相比计算更加复杂,理论更加严谨,更符合真实世界的光照,严格遵守能量守恒定律。

    各向同性与各向异性

    各向异性意味着反射属性依赖于视角和表面法线,一个例子就是摩擦过的金属,在不同角度存在不同数量的反射光线
     
    后面将会实现各向异性效果。


    漫反射模型

    Lambert模型非常简单但是并不适用于所有材质,效果不真实,其材质均匀,不能反映粗糙度带来的变化。
    注 意:因为恰好进入眼睛的是物体表面的一小部分部分反射光,并且光射到表面其部分会被吸收,能量会被减弱,所以没有绝对的光强为1的物体表面,比如,假使一 个反射光强为1(错误)的物体表面,向他打纯红色的光,他是不会变为红色的,因为纯光强为1编码为RGB格式为(1,1,1),而纯红色的光为 (1,0,0)所以不会为红色,所以这个是错误的,自然界中,无论我们看着多白的物体,打上红光也变红,这就是能量守恒定律,自然界的反射光强的最大极值 为1/π,这也解释了为什么一些基于物理漫反射模型会除以π的原因了。
    游戏中基于物理的渲染能够更好在HDR高动态范围图像中会有更真实的效果。

    Oren-Nayar漫反射模型

    Lambert过于均匀不能表现材质的粗糙度,比如灰尘,粘土,衣服等等高度回射的材质,回射是物体表面粗糙,存在一定数量的反射光指向光源,Oren-Nayar能更好的实现这种回射效果,显得更为平坦,尤其是实现与光线方向相同的时候。
    博主之前看过风之旅者的ppt,他们就是用Oren-Nayar模型来实现松散沙子的漫反射的,效果真实可信
    Oren-Nayar模拟的粗糙的小面非常小,屏幕上一个像素包括大量的方向不同的小面在一起,而对于Lambert只包含一个面
    对于模型的粗糙程度,描述这些小平面的方向作为一个平均值为0的随机高斯分布。根据这个,可以用一个标准差来度量表面的粗糙程度,标准差越高说明这些小平面的方向越各自不同,表面就越粗糙。我们把这个控制粗糙度的变量设为σ。
    公式如下:
     

    实现结果:


    Minnaert模型

    作者说实现效果像天鹅绒,博主感觉。。。参数调大一点直接像高光了好不好。。。总之博主认为效果不好。。。
    Minnaert模型意图沿着边缘发射“黑光”,使得结果非常像天鹅绒(才不像。。。)
    公式如下:
     
    实现结果:



    镜面反射模型

    镜面反射与漫反射并不相同,漫反射是向所有方向反射,而镜面反射只向镜面方向反射,
     

    ward反射模型

    ward反射模型比phong更加物理精确。
    它含有各向同性各向异性两种模型
    各向同性:
    sigma变量用来控制粗糙度
     
    实现结果:



    各向异性:
    两个变量代表水平、垂直两个正交方向的粗糙度
     
    其实他这个公式的eta方位角听不清楚的,没给明tangent怎么求,博主又找了些资料遂实现之:


    结果如下:





    视觉化的结果如下,左侧为各项同性的高光,右侧为各向异性的高光,各向异性这种不规则的形状说明反射更倾向于给定的方向
     



    schlick模型

    schlick模型相比于phong模型计算消耗要少一些,免去了指数运算,但是效果相对phong有差别
    公式如下:
     

    实现结果:



    Cook-Torrance模型

    Cook-Torrance模型基于Torrance和Sparrow致力于建立一个BRDF来模拟金属镜面反射

    基本原理是假设物体表面是由无数不同方向的绝对光滑的小微面组成,存在几何对光照的影响,比如凹凸产生的投影以及对光线的阻挡。
    模型也含有菲涅尔项在不同角度的入射光线的反射光线的数量。完整的基本公式如下:
     
    有三个重要的项F,D,G来控制不同的效果。D控制粗糙度,G为几何项,控制小微面相互之间的阴影和遮挡,从而决定镜面反射光数量

    G项

    公式:

     
    G项没有什么额外的依赖物理属性的参数来控制效果变化

    F项

    F项为菲涅尔项,决定从小微面反射光线的数量并且控制物体视觉的的金属性程度。
    公式如下:
     
    菲涅尔有时依赖波长来产生丰富的效果。

    D项

    D项为法线分布项,用来控制小微面的斜率从而决定表面粗糙度。D项有很多种模型来实现比如blinn,Beckmann,并且未来还会研究出更多种D模型,具体可以看这篇文章:

    Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF

     


    本书讲了两种方法
    Beckmann:
     

    和另一种基于高斯分布的Blinn,Blinn计算起来消耗更小:
     

    全部结合起来实现结果是这样的:





    近期更新下一章

    博主近期渲染:

    近期渲染


     

                                  ---- by wolf96














  • 相关阅读:
    python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作
    python模拟鼠标键盘操作 GhostMouse tinytask 调用外部脚本或程序 autopy右键另存为
    vue.js移动端app实战3:从一个购物车入门vuex
    vue 做登陆页面 ( 登陆成功后去掉注册和登陆按钮 显示用户名)
    vue中手机号,邮箱正则验证以及60s发送验证码
    从零开始徒手撸一个vue的toast弹窗组件
    vue 更改头像功能实现
    event.srcElement与event.target的区别
    vue中使用axios post上传头像/图片并实时显示到页面
    vue开发:移动端图片上传
  • 原文地址:https://www.cnblogs.com/zhanlang96/p/5376904.html
Copyright © 2011-2022 走看看