shader入门精要读书笔记20 Unity中的光源类型与衰减计算
一、光源类型
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中的光源类型与衰减计算相关推荐
- 【unity shader 入门精要 读书笔记】透明
一.透明 1.透明度测试[Alpha Test] 它采用一种"霸道极端"的机制:只要有一个片元的透明度不满足条件[通常是小于某个阈值],那么它对应的片元就会被舍弃.被舍弃的片元将不 ...
- shader入门精要读书笔记40 素描风格的渲染
总结下头文件: HLSLSupport.cginc - (自动包含) 为跨平台的着色器编译宏和定义提供帮助. UnityShaderVariables.cginc - (自动包含)常用的全局变量. U ...
- shader入门精要读书笔记23 高级纹理-渲染纹理-镜子效果、玻璃效果
一.前言 现代GPU允许我们把整个三维场景目标渲染到一个中间缓冲中,即渲染目标纹理(RTT). 多重渲染目标(MRT),这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中,而不再需要为每个 ...
- Unity Shader入门精要读书笔记(14)
尽管渲染大多以照片写实主义为主要目标,但是非真实感渲染(NPR)也经常被使用. 卡通风格的渲染 卡通风格是游戏中常见的一种渲染风格.使用这种风格的游戏画面通常有一些共有的特点,例如物体都被黑色的线条描 ...
- 【unity shader 入门精要 读书笔记】折射
当光线从一种介质[例如空气]斜射入另外一种介质[例如玻璃]时,传播方向一般会发生改变. 当给定入射角时,可以使用 斯涅耳定律[Snell's Law]来计算反射角. 当光从介质 1 沿着和表面法线夹角 ...
- Shader入门精要读书笔记11
第12章 屏幕后处理效果 总的来说把渲染出来的结果(Texture),类似于又用PS处理了一下.方法就是把不同的脚本加在摄像机上,脚本和Shader共同使画面具有不同的效果. OnRenderImag ...
- Shader入门精要读书笔记12
第13.14章 深度和法线纹理.非真实渲染 实现更加贴近应用的渲染效果(运动模糊.雾.卡通风格.素描风格),往往需要更加巧妙的思路和数学计算. 透视投影和正交投影的原理复习. 2种获取深度和法线纹理的 ...
- Unity Shader入门精要——第3章 Unity Shader基础
Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...
- 《Unity Shader入门精要》笔记:初级篇(1)
本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...
最新文章
- 特斯拉Model3交付危机:周产5000辆仍需排队一年,造空者花式补刀
- Mobileye采用单目摄像头做ADAS太不精确
- 复习笔记(六)——C++运算符重载(难点)
- Facebook基于数据中心的机器学习实践
- java学jdk几_Java系列学习(一)-JDK下载与安装
- Python爬取天气数据及可视化分析!
- HTML5概要与新增标签
- intellij 快捷键_IntelliJ中的键盘快捷键
- python 判断数据类型,是否与已知相同
- Nginx文档阅读笔记-DNS load balancing(DNS负载均衡)
- service get list一般规范
- [改善Java代码]不推荐使用binarySearch对列表进行检索
- Django安装(for Mac)
- Word文档分割总结
- 老大加需求:做一个支持超大文件HTTP断点续传的上传服务,我懵逼了~
- AJAX框架大全 (AJAX Frameworks)
- Spring Boot layered(分层) jar 构建docker镜像
- RSA加密、解密 JAVA版 lua版 js版
- idea插件开发--组件--编程久坐提醒
- 7-2 寻找大富翁 (34 分)