什么是光照模型

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

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

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

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


环境反射光(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. 运用Merge Into实现增加或更新数据

    declare @SqlStr as nvarchar(max) set @SqlStr=N'Merge Into [Categories] t USING(VALUES (9,''rice'','' ...

  2. Java中获取路径的方法_自我分析

    就目前的我来说最常用的两种获取路径的方法是  class.getRecource(filename) 和 class.getclassloader.getRecource(filename) 这两者的 ...

  3. jsp提交表单问题

    以form形式提交的话 String usernameInForm = hreq.getParameter("username");String passwordInForm = ...

  4. Android OpenGL ES(七)基本几何图形定义 .

    在前面Android OpenGL ES(六):创建实例应用OpenGLDemos程序框架 我们创建了示例程序的基本框架,并提供了一个“Hello World”示例,将屏幕显示为红色. 本例介绍Ope ...

  5. UVALive - 3942 Remember the Word

    input 字符串s  1<=len(s)<=300000 n 1<=n<=4000 word1 word2 ... wordn 1<=len(wordi)<=10 ...

  6. 安卓常用 widget

    验证码 public class SpinnerImg extends ImageView { /** * 完成选择后启动另外一个spinner */ private ItemListener ite ...

  7. 设计模式-中介者模式(Mediator)

    /***中介者模式在消息队列中的应用*/package test.mediator; public abstract class Message { private Messages messages ...

  8. 《CSS设计指南》阅读笔记

    一.HTML实体 HTML实体常用于生成那些键盘上没有的印刷字符.以一个和号(&)开头,一个分号(:)结尾,二者之间是表示实体的字符串. 如:“左引号(")     ”右引号(&qu ...

  9. const与static的区别

    const就是只读的意思,只在声明中使用;const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. const的作用: (1)可以定义const常量,具有不可变性. (2)便于进行类 ...

  10. EF5修改edmx表结构保存后不自动更新tt (转)

    http://blog.csdn.net/panderman/article/details/8172968 不知道这算不算一个bug,当你新建一个从数据库生成的edmx时,他能正确的生成所有的tt文 ...