UnityShader实现较为完整的光照模型(Lambert+Phong+三色环境光+阴影+环境遮蔽(AO))
此篇文章为庄懂技术美术课程学习笔记。
首先一个基本光照的组成可以是以下这些
将这些光分别组合就可以得到一个较好的光照模型
AO(环境遮蔽)是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光、飘和阴影不实等问题,解决或改善场景中缝隙、角线以及细小物体等的表现不清晰问题,综合改善细节尤其是暗部阴影,增强空间的层次感、真实感,同时加强和改善画面明暗对比,增强画面的艺术性。
Lambert+Phong的实现思路在之前的文章中都有过说明,这里就不在重复。
三色环境光实现的核心思路:
法线的G通道是顶光,将其乘上-1就是底光,再用1减去顶光和底光,就是剩余的四周的环境光。
投影调用的方法:
连连看部分
先是连连看部分的实现
代码部分
接着是代码部分的实现
Shader "AP01/L08/OldSchoolPlus" {Properties {_BaseCol ("基本色", Color) = (0.5, 0.5, 0.5, 1.0)_LightCol ("光颜色", Color) = (1.0, 1.0, 1.0, 1.0)_SpecPow ("高光次幂", Range(1, 90)) = 30_Occlusion ("AO图", 2D) = "white" {}_EnvInt ("环境光强度", Range(0, 1)) = 0.2_EnvUpCol ("环境天顶颜色", Color) = (1.0, 1.0, 1.0, 1.0)_EnvSideCol ("环境水平颜色", Color) = (0.5, 0.5, 0.5, 1.0)_EnvDownCol ("环境地表颜色", Color) = (0.0, 0.0, 0.0, 0.0)}SubShader {Tags {"RenderType"="Opaque"}Pass {Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"// 追加投影相关包含文件#include "AutoLight.cginc"#include "Lighting.cginc"#pragma multi_compile_fwdbase_fullshadows#pragma target 3.0// 输入参数uniform float3 _BaseCol;uniform float3 _LightCol;uniform float _SpecPow;uniform sampler2D _Occlusion;uniform float _EnvInt;uniform float3 _EnvUpCol;uniform float3 _EnvSideCol;uniform float3 _EnvDownCol;// 输入结构struct VertexInput {float4 vertex : POSITION; // 顶点信息 Get✔float4 normal : NORMAL; // 法线信息 Get✔float2 uv0 : TEXCOORD0; // UV信息 Get✔};// 输出结构struct VertexOutput {float4 pos : SV_POSITION; // 裁剪空间(暂理解为屏幕空间吧)顶点位置float2 uv0 : TEXCOORD0; // UV0float4 posWS : TEXCOORD1; // 世界空间顶点位置float3 nDirWS : TEXCOORD2; // 世界空间法线方向LIGHTING_COORDS(3,4) // 投影相关};// 输入结构>>>顶点Shader>>>输出结构VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0; // 新建输出结构o.pos = UnityObjectToClipPos( v.vertex ); // 变换顶点位置 OS>CSo.uv0 = v.uv0; // 传递UVo.posWS = mul(unity_ObjectToWorld, v.vertex); // 变换顶点位置 OS>WSo.nDirWS = UnityObjectToWorldNormal(v.normal); // 变换法线方向 OS>WSTRANSFER_VERTEX_TO_FRAGMENT(o) // 投影相关return o; // 返回输出结构}// 输出结构>>>像素float4 frag(VertexOutput i) : COLOR {// 准备向量float3 nDir = normalize(i.nDirWS);float3 lDir = _WorldSpaceLightPos0.xyz;float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.posWS.xyz);float3 rDir = reflect(-lDir, nDir);// 准备点积结果float ndotl = dot(nDir, lDir);float vdotr = dot(vDir, rDir);// 光照模型(直接光照部分)float shadow = LIGHT_ATTENUATION(i); // 获取投影float lambert = max(0.0, ndotl);float phong = pow(max(0.0, vdotr), _SpecPow);float3 dirLighting = (_BaseCol * lambert + phong) * _LightCol * shadow;// 光照模型(环境光照部分)float upMask = max(0.0, nDir.g); // 获取朝上部分遮罩float downMask = max(0.0, -nDir.g); // 获取朝下部分遮罩float sideMask = 1.0 - upMask - downMask; // 获取侧面部分遮罩// 混合环境色float3 envCol = _EnvUpCol * upMask + _EnvSideCol * sideMask + _EnvDownCol * downMask;float occlusion = tex2D(_Occlusion, i.uv0); // 采样Occlusion贴图float3 envLighting = envCol * _EnvInt * occlusion; // 计算环境光照// 返回结果float3 finalRGB = dirLighting + envLighting;return float4(finalRGB, 1.0);}ENDCG}}FallBack "Diffuse"
}
这些都是很传统的光照模型的组合,但是运用了现代一些PBR的理念,这些光照模型也可以做不错的美术资源的产出
UnityShader实现较为完整的光照模型(Lambert+Phong+三色环境光+阴影+环境遮蔽(AO))相关推荐
- 朗伯辐射强度模型MATLAB,局部光照模型杂记【Lambert/Phong/Blin-Phong/BRDF/BSSRDF/Cook-Torrance】...
Lambert Lambert不包括任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境.简单来说是一种"磨砂效果". Lambert材质可以是透明的,可以在 ...
- 兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)
关于漫反射 光打到凹凸不平的平面上,光线会被反射到四面八方,被称为漫反射 关于这种模型,由于光线由于分散,所以进入人眼的光线强度和观察角度没有区别 在A点和B点接收到的光线强度是一样的 在漫反射下,光 ...
- 验证身份证号码,较为完整的,可以验证身份证真伪
下边的方法可以较为完整的验证身份证真伪,可到当前平台验证身份证真伪http://www.ip33.com/shenfenzheng.html checkCode(val) { var p = /^[1 ...
- Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)
Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三) 本篇目录: 六.完整构建整个[旋转的精灵女孩]实例 (1).新建.启动webGL工程空间 (2).构建项目的目录层次结构 (2. ...
- 简单光照模型与Phong光照模型
光照模型(Illumination model)用于物体表面某点处的光强度计算. 一.简单光照模型 简单光照模型中只考虑 反射光 的作用, 反射光由 环境光 . 漫反射光 和 镜面反射光 三部分 ...
- 如何手撸一个较为完整的RPC框架
[文章作者/来源]一个没有追求的技术人/https://sourl.cn/sJ4Brp 缘 起 最近在公司分享了手撸RPC,因此做一个总结. 概 念 篇 RPC 是什么? RPC 称远程过程调用(Re ...
- 如何手撸一个较为完整的RPC框架?
点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6992867064952127524 缘起 最近在公司分享了手撸RPC,因此做一个总结. 概念篇 RPC 是什么? RPC ...
- c语言基础知识(知识点较为完整)
计算机和c语言基础知识 计算机常识 什么是计算机? 顾名思义,就是能够进行数据运算的机器(台式电脑.笔记本电脑.平板电脑.智能手机) 计算机_百度百科 计算机的发明者是谁 ? 关于电子计算机的发明者是 ...
- ble系统知识介绍(较为完整,持续更新中)
BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵 ...
最新文章
- 4 RACMulticastConnection 连接类
- 70个python毕设项目_10 个最值得 Python 新人练手的有趣项目
- ICCV 2019 开源论文 | 基于元学习和AutoML的模型压缩新方法
- PHP监測memcache服务端的执行状况
- 专用计算机 一级专用计算机芯片,计算机一级考试 2015年模拟题(一)
- WIN10+Ubuntu16.4 双系统,遇到的坑
- 分分钟使用Retrofit+Rxjava实现网络请求
- 006 认识BeanNameAware
- 创业始于自信 成功缘于诚信
- 小李飞刀:醉卧沙场君莫笑,python你还是等等我
- 【渝粤教育】国家开放大学2018年春季 0553-21T色彩 参考试题
- 北大计算机mooc题库,人工智能原理MOOC习题集及答案 北京大学 王文敏
- zstu新生赛 Problem A: Baby Coins(折半枚举+二分)
- NFA转DFA与DFA简化
- 2020年十个强大的数据建模工具
- AUTOCAD——全屏显示
- JSP中的scriptlet和注释
- 分享:电脑虚拟内存到底能不能关掉
- There are test failures
- 使用Blinker控制esp01s Relay继电器模块