什么是光照模型

光照模型就是模拟光在物体间的传递过程,以确保物体可见表面每一点的亮度和颜色。

当光照射到一个物体表面时,光可能被吸收、反射或折射。反射和折射的光使物体可见。如果入射光全部被吸收,物体将不可见,称物体为黑体。

一个物体表面呈现的颜色是有物体表面向视线方向辐射的光能中各种波长的分布所确定的。

如果物体是不透明的,则物体表面呈现的颜色仅有其反射光决定,通常把反射光考虑成环境反射光、漫反射光和镜面反射光三个分量的组合。


环境反射光(Ambient Light)

环境反射光是由于邻近物体所造成的光多次反射所产生的。光是从来自四面八方的,如从墙壁、地板以及天花伴等反射回来的光,是一种分布光源。

通常将这种光产生的效应简化为在各个方向都有均匀的光亮度Ia

一个物体只有环境光照明时,其表面上各个点的明暗程度完全一样。其光亮度表示为:

  I= Ia * Ka

  • Ie:物体的环境光反射光亮度;
  • Ia:环境光亮度;
  • Ka:物体表面的环境光反射系数( 0 ≤ K≤ 1)
//环境光直接获取
//UNITY_LIGHTMODEL_AMBIENT是Unity自带的宏定义常量
float3 ambientLighting = float3(UNITY_LIGHTMODEL_AMBIENT) * float3(_Color); //_Color是Shader中添加的一个Property属性
Properties {
  _Color ("Diffuse Material Color", Color) = (1,1,1,1)
}

  


漫反射光(DIffuse Light)

漫反射光是由特定的光源在物体表面反射光中那些向空间各方向均匀反射出去的光。这种光的反射强度与观察点的位置是无关的,它的光强度与入射光方向和反射点处于的表面法线间的夹角余弦成正比。

假设物体表面在P点的法线为N,从P点指向光源的向量为L,两者夹角为θ。点P处漫反射光亮度为:

  Id = Ip * K* COSθ

  • Id:表面漫反射光亮度;
  • IP:入射光的光亮度;
  • Kd:漫反射系数(决定与表面材料及入射光波长) ( 0 ≤ Kd ≤ 1);
  • θ:入射光线与法线间的夹角,0 ≤ θ ≤ PI / 2;

//计算的漫反射光
float3 diffuseReflection = float3(_LightColor0) * float3(_Color)* max(0.0, dot(normalDirection, lightDirection));

镜面反射光(Specular Light)

镜面反射光是朝一个方向的反射光。

对于理想镜面,入射到表面的光严格地遵守光的反射定律,只有在反射方向上,观察者才能看到从镜面反射出来的光线,如下图a。

对于一般光滑平面,由于表面具有一定的粗糙度,其表面实际上是有许多朝向不同的微小表面组成,其镜面反射光散布在反射方向周围,如下图b。

镜面反射光亮度可表示为:

  Is = Is * Ks * cosnφ

  • Is:观察者接受到的镜面反射光亮度;
  • Ip:入射光的亮度;
  • Ks:镜面反射系数(与材料材质和入射光波有关);
  • φ:镜面反射方向与视线方向的夹角;
  • n:镜面反射光的会聚系数(与物体表面的光滑度相关),一般1 ≤ n ≤ 2000;

对于较光滑的表面,其镜面反射光会聚程度较高,n值较大;而较粗糙的镜面反射光呈发散状态,n值较小。

//_Object2World与_World2Object均为unity提供的内置uniform参数
float4x4 modelMatrix = _Object2World;
//世界坐标系到对象坐标系的变换矩阵
float4x4 modelMatrixInverse = _World2Object; //法向量N变化至对象坐标系
float3 normalDirection = normalize(float3(mul(float4(input.normal, 0.0), modelMatrixInverse))); //平行光源的入射向量L直接由uniform_WorldSpaceLightPos0给出
float3 lightDirection =normalize(float3(_WorldSpaceLightPos0)); //观察向量V由摄像机坐标与顶点坐标矢量相减
float3 viewDirection = normalize(float3(float4(_WorldSpaceCameraPos, 1.0)
- mul(modelMatrix, input.vertex))); //镜面反射光的计算
float3 specularReflection=float3(_LightColor0)*float3(_SpecColor)*pow(max(0.0,dot(reflect(-lightDirection, normalDirection),viewDirection)),_Shininess);

  

[Unity Shader]光照模型对物体的假设的更多相关文章

  1. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  2. 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现

    [Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...

  3. 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

    写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...

  4. Unity Shader入门精要学习笔记 - 第9章 更复杂的光照

    转载自 冯乐乐的<Unity Shader入门精要> Unity 的渲染路径 在Unity里,渲染路径决定了光照是如何应该到Unity Shader 中的.因此,如果要和光源打交道,我们需 ...

  5. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  6. Unity Shader——Writing Surface Shaders(3)——Surface Shader Lighting Examples

    Surface Shader 光照例子 这里有一些自定义光照模型和Surface Shaders的例子.通常的Surface Shader例子在这里. 由于延迟光照在某些自定义的逐材质光照模型中表现得 ...

  7. Unity Shader 知识点总结(一)

    在学习了一段时间的Unity Shader后,打算写一些知识总结,便于今后的查找.如有错误,希望大家指出更改. 本文参照的unity入门精要一书,做一个知识归纳,如有兴趣可以看看其开源的部分,是一本比 ...

  8. Unity Shader入门教程(一)

    参考文献:http://www.360doc.com/content/13/0923/15/12282510_316492286.shtml Unity Shader是着色器,将纹理.网格信息输入,得 ...

  9. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...

随机推荐

  1. 源代码管理工具-GIT

    源代码管理工具-GIT ---- 一. 掌握 - git 概述 1. git 简介? 什么是git? git是一款开源的分布式版本控制工具在世界上所有的分布式版本控制工具中,git是最快.最简单.最流 ...

  2. PHP显示超全局变量和显示程序执行时间

    <?php header('Content-type: text/html; charset=utf-8'); $t1 = microtime(true);//记录脚本刚开始运行是的时间戳 ec ...

  3. frameset导航框架

    1.制作导航框架(注意"name='mainframe'") <html> <frameset cols="25%,75%"> < ...

  4. plat模板修改记录

    每个栏目显示文章数 homepage.hph 94行 $loop = new WP_Query('post_type=post&showposts=6&category_name=xi ...

  5. 最小生成树Prim

    首先解释什么是最小生成树,最小生成树是指在一张图中找出一棵树,任意两点的距离已经是最短的了. 算法要点: 1.用book数组存放访问过的节点. 2.用dis数组保存对应下标的点到树的最近距离,这里要注 ...

  6. Servlet程序开发-Helloworld

    D:\Workspace\WEB-INF\classes下新建HelloServlet.java文件: package org.lxh.servletdemo ; import java.io.* ; ...

  7. SQL2005附加数据库时遇到的问题:用户组或角色在当前数据库已存在

    一次 附加备份数据库的 mdf 文件     成功后   创建登陆用户    但是  无法映射该用户的 对应数据库  出现 用户组或角色在当前数据库已存在 的问题 首先介绍一下sql server中“ ...

  8. iOS中FMDB和GCD剖析

    转载至:http://www.cocoachina.com/industry/20130819/6821.html 英文链接:https://github.com/ccgus/fmdb 由于FMDB是 ...

  9. C#入门经典第九章定义类-1

    1.C#中使用class关键字来定义类 class MyClass { //代码部分 } 定义了类之后,就可以在项目中能访问该定义的其他位置对该类进行实例化.默认情况下,类的声明是内部的,即只有当前项 ...

  10. OpenGL学习-------点、直线、多边形

    上一课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处.例如:点太小,难以看清楚:直线也太细,不舒服:或者想画虚线,但不知道方法只能用许多短直线,甚至用点组合而成. ...