此篇文章为庄懂技术美术课程学习笔记。

首先一个基本光照的组成可以是以下这些

将这些光分别组合就可以得到一个较好的光照模型

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))相关推荐

  1. 朗伯辐射强度模型MATLAB,局部光照模型杂记【Lambert/Phong/Blin-Phong/BRDF/BSSRDF/Cook-Torrance】...

    Lambert Lambert不包括任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境.简单来说是一种"磨砂效果". Lambert材质可以是透明的,可以在 ...

  2. 兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

    关于漫反射 光打到凹凸不平的平面上,光线会被反射到四面八方,被称为漫反射 关于这种模型,由于光线由于分散,所以进入人眼的光线强度和观察角度没有区别 在A点和B点接收到的光线强度是一样的 在漫反射下,光 ...

  3. 验证身份证号码,较为完整的,可以验证身份证真伪

    下边的方法可以较为完整的验证身份证真伪,可到当前平台验证身份证真伪http://www.ip33.com/shenfenzheng.html checkCode(val) { var p = /^[1 ...

  4. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三) 本篇目录: 六.完整构建整个[旋转的精灵女孩]实例 (1).新建.启动webGL工程空间 (2).构建项目的目录层次结构 (2. ...

  5. 简单光照模型与Phong光照模型

    光照模型(Illumination model)用于物体表面某点处的光强度计算. 一.简单光照模型 简单光照模型中只考虑 反射光 的作用,   反射光由 环境光 . 漫反射光 和 镜面反射光 三部分 ...

  6. 如何手撸一个较为完整的RPC框架

    [文章作者/来源]一个没有追求的技术人/https://sourl.cn/sJ4Brp 缘 起 最近在公司分享了手撸RPC,因此做一个总结. 概 念 篇 RPC 是什么? RPC 称远程过程调用(Re ...

  7. 如何手撸一个较为完整的RPC框架?

    点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6992867064952127524 缘起 最近在公司分享了手撸RPC,因此做一个总结. 概念篇 RPC 是什么? RPC ...

  8. c语言基础知识(知识点较为完整)

    计算机和c语言基础知识 计算机常识 什么是计算机? 顾名思义,就是能够进行数据运算的机器(台式电脑.笔记本电脑.平板电脑.智能手机) 计算机_百度百科 计算机的发明者是谁 ? 关于电子计算机的发明者是 ...

  9. ble系统知识介绍(较为完整,持续更新中)

    BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵 ...

最新文章

  1. 4 RACMulticastConnection 连接类
  2. 70个python毕设项目_10 个最值得 Python 新人练手的有趣项目
  3. ICCV 2019 开源论文 | 基于元学习和AutoML的模型压缩新方法
  4. PHP监測memcache服务端的执行状况
  5. 专用计算机 一级专用计算机芯片,计算机一级考试 2015年模拟题(一)
  6. WIN10+Ubuntu16.4 双系统,遇到的坑
  7. 分分钟使用Retrofit+Rxjava实现网络请求
  8. 006 认识BeanNameAware
  9. 创业始于自信 成功缘于诚信
  10. 小李飞刀:醉卧沙场君莫笑,python你还是等等我
  11. 【渝粤教育】国家开放大学2018年春季 0553-21T色彩 参考试题
  12. 北大计算机mooc题库,人工智能原理MOOC习题集及答案 北京大学 王文敏
  13. zstu新生赛 Problem A: Baby Coins(折半枚举+二分)
  14. NFA转DFA与DFA简化
  15. 2020年十个强大的数据建模工具
  16. AUTOCAD——全屏显示
  17. JSP中的scriptlet和注释
  18. 分享:电脑虚拟内存到底能不能关掉
  19. There are test failures
  20. 使用Blinker控制esp01s Relay继电器模块

热门文章

  1. 孔子的“治学三境界”
  2. 51单片机I/O端口的结构和工作原理
  3. 引言-知识技能树(数据分析相关)
  4. artemis mq配置开机启动 (centos7)(artemis Init Script)
  5. 2023年电气,电子与信息工程国际会议(ISEEIE-2023)
  6. win10修改用户名导致问题及解决
  7. vue3 PropType
  8. 完美解决无Internet但能正常上网的问题
  9. 对AWS的计费有点糊涂
  10. 自己动手写一个操作系统——MBR(1)