什么是光照模型

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

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

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

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


环境反射光(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. 转: oracle 存储过程 执行动态 实现sql

    http://jingyan.baidu.com/article/5d6edee2fbb9f999eadeecb9.html http://jingyan.baidu.com/article/3638 ...

  2. php mysql 实现消息队列

    最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...

  3. eclipse提升注解提示速度

    preference--输入content--java--editor--content Assist--aoto delay 选项 改为100或者更低  提示速度              --ao ...

  4. UIGestureRecognizer 手势浅析

    目录[-] iOS开发中的手势体系——UIGestureRecognizer分析及其子类的使用 一.引言 二.手势的抽象类——UIGestureRecognizer 1.统一的初始化方法 2.手势状态 ...

  5. php薪资

    2千的php程序员就是可以用cms,做一个小企业的门户网站. 3千的php程序员,可以自己写代码开发php软件,但是这样程序员写的代码非常混乱,通常只能写数千行代码的小软件,并且痛苦的完工. 4K的p ...

  6. 隐式intent启动电子邮件,不需要非电子邮件应用程序。

    Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.put ...

  7. HBase性能优化方法总结(一):表的设计

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第一部分内容:表的设计相关的优化方法 ...

  8. HDU ACM 1495 非常可乐(广搜BFS)

    非常可乐 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  9. “找回” Envi 快捷方式

      Envi+IDL文件夹挪到别的电脑,不用安装,直接可以使用.但是桌面和开始菜单没有了Envi,IDL,envi+idl的快捷方式,很不方便.   记录一下快捷方式命令行,备用: envi快捷方式 ...

  10. Redis 密码设置和登录

    Redis 一般在生产环境中,大家都不使用密码,为了确保安全,都是在防火墙上对redis端口做IP白名单的 我是个技术控,我非得了解一下密码这回事[虽然以后不会用到,呵呵] 好了,废话不多说,简单介绍 ...