一、光源类型

Unity中4中光源:平行光、点光源、聚光灯、面光源(只在烘焙时发生作用)。

光源位置、方向、颜色、强度、衰减等等都与他们的属性息息相关,会影响到Shader。

1.平行光
他没有唯一的位置,它的几何属性只有方向。

2.点光源
表示由一个点发出的向所有方向延伸的光。
照亮空间有限,存在位置等属性,存在衰减等等。

3.聚光灯
是由一块锥形区域定义的,从一个特定位置出发,向特定方向延伸的光。
最复杂的一种光源,照亮空间有限,存在位置、方向、衰减等等。

二、在前向渲染中处理不同的光源类型

前向渲染路径时,Unity Shader会访问5个光源属性:
位置、方向、颜色、强度、衰减,

实践:默认平行光和绿色点光源


Pass
{Tags{"LightMode"="ForwardBase"}//设置Base PassCGPROGRAM#pragma multi_compile_fwdbase  //编译指令确保Shader中光照衰减等光照变量被正确赋值。......//片元着色器中fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //在片元着色器中计算环境光fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*max(0,dot(worldNormal,worldLightDir));fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);fixed atten = 1.0;return fixed4(ambient+(diffuse+specular)*atten,1.0);
}
------------------------------------------------------
//此时Unity中只有一个平行光,就在Base Pass处理。Base Pass处理的一定是平行光。
//如果没有平行光时,Base Pass会当作全黑的光源处理。
//但当着色器中有多个平行光时,Base Pass会处理最亮的平行光,其他平行光会传递给Addition Pass中处理。
------------------------------------------------------
Pass
{Tags{"LightMode"="ForwardAdd"} //设置Addition PassBlend One One   //开启混合模式将此光照结果和之前帧缓存中的光照进行叠加CGPROGRAM#pragma multu_compile_fwdadd //保证我们在Pass中得到正确的光照变量......//片元着色器中首先需要判断光源类型,计算不同光源的方向#ifdef USING_DIRECTIONAL_LIGHTfixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);#elsefixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz-i.worldPosition.xyz);#endif //以上为了计算不同光源类型时,光源方向fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*max(0,dot(worldNormal,worldLightDir));fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldNormal,halfDir)),_Gloss);#ifdef USING_DIRECTIONAL_lIGHTfixed atten = 1.0;#elsefloat lightCoord = mul(_LightMatrix0,float4(i.worldPosition,1)).xyz;fixed atten = tex2D(_LightTexture0,dot(lightCoord,lightCoord).rr).UNITY_ATTEN_CHANNEL;//宏UNITY_ATTEN_CHANNEL是为了得到衰减纹理中衰减值所在的分量。#endlf//计算不同光源类型的衰减效果,lightCoord是将顶点位置转换到光源空间//衰减效果使用一张纹理作为查找表,计算衰减。//我们通常关心的是纹理对角线上的纹理颜色值,其表示了光源空间中不同距离的衰减值。return fixed4(ambient+(diffuse+specular)*atten,1.0);
}

也可以使用线性数学方法计算衰减:

float distance = length(_WorldSpaceLightPos0.xyz-i.worldPosition.xyz);
atten = 1.0/distance;

一些补充:

Unity绘制光源的顺序是按照重要程度排序的,与颜色、强度、距离有关。
Untiy不会渲染不在聚光灯内的光源。
在前向渲染路径中,可以使用前向渲染路径中的内置函数和内置变量计算逐顶点与SH光源。

shader入门精要读书笔记20 Unity中的光源类型与衰减计算相关推荐

  1. 【unity shader 入门精要 读书笔记】透明

    一.透明 1.透明度测试[Alpha Test] 它采用一种"霸道极端"的机制:只要有一个片元的透明度不满足条件[通常是小于某个阈值],那么它对应的片元就会被舍弃.被舍弃的片元将不 ...

  2. shader入门精要读书笔记40 素描风格的渲染

    总结下头文件: HLSLSupport.cginc - (自动包含) 为跨平台的着色器编译宏和定义提供帮助. UnityShaderVariables.cginc - (自动包含)常用的全局变量. U ...

  3. shader入门精要读书笔记23 高级纹理-渲染纹理-镜子效果、玻璃效果

    一.前言 现代GPU允许我们把整个三维场景目标渲染到一个中间缓冲中,即渲染目标纹理(RTT). 多重渲染目标(MRT),这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中,而不再需要为每个 ...

  4. Unity Shader入门精要读书笔记(14)

    尽管渲染大多以照片写实主义为主要目标,但是非真实感渲染(NPR)也经常被使用. 卡通风格的渲染 卡通风格是游戏中常见的一种渲染风格.使用这种风格的游戏画面通常有一些共有的特点,例如物体都被黑色的线条描 ...

  5. 【unity shader 入门精要 读书笔记】折射

    当光线从一种介质[例如空气]斜射入另外一种介质[例如玻璃]时,传播方向一般会发生改变. 当给定入射角时,可以使用 斯涅耳定律[Snell's Law]来计算反射角. 当光从介质 1 沿着和表面法线夹角 ...

  6. Shader入门精要读书笔记11

    第12章 屏幕后处理效果 总的来说把渲染出来的结果(Texture),类似于又用PS处理了一下.方法就是把不同的脚本加在摄像机上,脚本和Shader共同使画面具有不同的效果. OnRenderImag ...

  7. Shader入门精要读书笔记12

    第13.14章 深度和法线纹理.非真实渲染 实现更加贴近应用的渲染效果(运动模糊.雾.卡通风格.素描风格),往往需要更加巧妙的思路和数学计算. 透视投影和正交投影的原理复习. 2种获取深度和法线纹理的 ...

  8. Unity Shader入门精要——第3章 Unity Shader基础

    Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...

  9. 《Unity Shader入门精要》笔记:初级篇(1)

    本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...

最新文章

  1. 特斯拉Model3交付危机:周产5000辆仍需排队一年,造空者花式补刀
  2. Mobileye采用单目摄像头做ADAS太不精确
  3. 复习笔记(六)——C++运算符重载(难点)
  4. Facebook基于数据中心的机器学习实践
  5. java学jdk几_Java系列学习(一)-JDK下载与安装
  6. Python爬取天气数据及可视化分析!
  7. HTML5概要与新增标签
  8. intellij 快捷键_IntelliJ中的键盘快捷键
  9. python 判断数据类型,是否与已知相同
  10. Nginx文档阅读笔记-DNS load balancing(DNS负载均衡)
  11. service get list一般规范
  12. [改善Java代码]不推荐使用binarySearch对列表进行检索
  13. Django安装(for Mac)
  14. Word文档分割总结
  15. 老大加需求:做一个支持超大文件HTTP断点续传的上传服务,我懵逼了~
  16. AJAX框架大全 (AJAX Frameworks)
  17. Spring Boot layered(分层) jar 构建docker镜像
  18. RSA加密、解密 JAVA版 lua版 js版
  19. idea插件开发--组件--编程久坐提醒
  20. 7-2 寻找大富翁 (34 分)

热门文章

  1. docker 容器的进入 停止 启动
  2. iOS 2019 最新面试题集锦
  3. python关键字定义_python使用什么关键字定义类
  4. Java单元测试实践-24.Gradle执行test任务卡死问题解决
  5. 删除OCR文字识别软件中的机密信息的教程
  6. java flexpaper 使用_JAVA用flexpaper实现在线预览PDF文件
  7. flexPaper的注意事项
  8. 1047: 寻找嫌疑人
  9. C# Winform工控上位机控件库
  10. python pickle_python pickle - 刘江的python教程