前置:UnityShader9:光照基础回顾

一、漫反射光照

直接上代码:

注意其中 Tags 需要设置光照模式为 ForwardBase,它定义了该 Pass 在光照流水线中的角色,在不同的光照模式下 Unity 的内置光照变量属性和含义都有可能不同

关于光照模式需要了解的的还有不少,不过可以暂时不用这么深究

Shader "Jaihk662/NewSurfaceShader"
{Properties{_DiffuseColor ("DiffuseColor", Color) = (1.0, 1.0, 1.0, 1.0)}SubShader{Tags { "LightMode" = "ForwardBase" }LOD 200PASS {CGPROGRAM#pragma vertex vert             //声明顶点着色器的函数#pragma fragment frag           //声明片段着色器的函数#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;struct _2vert {float4 vertex: POSITION;float3 normal: NORMAL;};struct vert2frag {float4 pos: SV_POSITION;fixed3 color: COLOR0;};vert2frag vert(_2vert v) {fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 wNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject)); fixed3 wLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * _DiffuseColor.rgb * saturate(dot(wNormal, wLightDir));vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.color = ambient + diffuse;return o;}fixed4 frag(vert2frag i): SV_Target {return fixed4(i.color, 1.0); }ENDCG}}FallBack "Diffuse"
}

效果如下:

代码中用到的 CG 数学方法:

  • saturate(x):将 x 中的所有参数都截取到 [0, 1] 的范围内

关于 CG 中所有的数学方法百科,可以见下一章

关于 Lighting.cginc:

若代码中用了 ForwardBase 光照模式,并且场景中有且只有一个光源:平行光,此时就可使用下面的光照参数(不同模式下参数含义可能不同,关于前向渲染模式具体可参考:https://blog.csdn.net/Jaihk662/article/details/112055588)

  • _WorldSpaceLightPos0:光源方向
  • _LightColor0:光源颜色

关于环境光 UNITY_LIGHTMODEL_AMBIENT

在 Window → Rendering → LightingSetting → 下面这个界面设置,Source 选项默认是天空盒

在着色器中,只需要通过 Unity 的内置变量 UNITY_LIGHTMODEL_AMBIENT 就可以得到对应的环境光颜色和强度信息

同理,逐像素光照代码如下:

Shader "Jaihk662/NewSurfaceShader"
{Properties{_DiffuseColor ("DiffuseColor", Color) = (1.0, 1.0, 1.0, 1.0)}SubShader{LOD 200PASS {Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert             //声明顶点着色器的函数#pragma fragment frag           //声明片段着色器的函数#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;struct _2vert {float4 vertex: POSITION;float3 normal: NORMAL;};struct vert2frag {float4 pos: SV_POSITION;fixed3 wNormal: NORMAL;};vert2frag vert(_2vert v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.wNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));return o;}fixed4 frag(vert2frag i): SV_Target {fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 wNormal = i.wNormal;fixed3 wLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * _DiffuseColor.rgb * saturate(dot(wNormal, wLightDir));return fixed4(ambient + diffuse, 1.0); }ENDCG}}FallBack "Diffuse"
}

二、镜面光照

一样的:

Shader "Jaihk662/NewSurfaceShader"
{Properties{_DiffuseColor ("DiffuseColor", Color) = (1.0, 1.0, 1.0, 1.0)_SpecularColor ("SpecularColor", Color) = (1.0, 1.0, 1.0, 1.0)_Gloss ("Gloss", Range(8.0, 256)) = 20}SubShader{LOD 200PASS {Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert             //声明顶点着色器的函数#pragma fragment frag           //声明片段着色器的函数#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;fixed4 _SpecularColor;float _Gloss;struct _2vert {float4 vertex: POSITION;float3 normal: NORMAL;};struct vert2frag {float4 pos: SV_POSITION;float3 wPos: TEXCOORD0;float3 wNormal: TEXCOORD1;};vert2frag vert(_2vert v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.wNormal = mul(v.normal, (float3x3)unity_WorldToObject);o.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(vert2frag i): SV_Target {fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 w1Normal = normalize(i.wNormal);fixed3 wLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * _DiffuseColor.rgb * saturate(dot(w1Normal, wLightDir));fixed3 reflectDir = normalize(reflect(-wLightDir, w1Normal));fixed3 viewDir = normalize(_WorldSpaceCameraPos - i.wPos);fixed3 specular = _LightColor0.rgb * _SpecularColor.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);return fixed4(ambient + diffuse + specular, 1.0); } ENDCG}}FallBack "Specular"
}

UnityShader9.1:光照基础实例相关推荐

  1. UnityShader9:光照基础回顾

    一.需要提前了解的 基于经验的基础光照,相比于后面物理光照的学习,简单不少: 光照基础:https://blog.csdn.net/Jaihk662/article/details/106624451 ...

  2. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  3. 一:FPGA从入门倒入坟-第一个基础实例蜂鸣器

    FPGA从入门倒入坟-第一个基础实例蜂鸣器 声明 代码 逻辑代码(.V文件) 端口约束文件(.UCF文件) 相关程序关键字解释 声明 本小白使用的是***Xilinx Spartan6***系列的开发 ...

  4. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--低级建模的基础实例(七)

    声明:本文为原创作品,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 第三章 ...

  5. 《地理信息系统基础实例操作100例》-实验15 设置字段属性域(无法创建要素问题)

    <地理信息系统基础实例操作100例>-实验15 设置字段属性域(无法创建要素问题) 零.观前须知 一.基本流程 二.所遇问题 三.解决方法(之一) (一)ArcCatalog操作 (二)A ...

  6. ProgressBar(进度条)-常用属性讲解与基础实例

    本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用到进度条:或者 ...

  7. zemax操作例子_ZEMAX基础实例 - 单透镜设计

    ZEMAX基础实例 - 单透镜设计 说明 日期:2011年11月17日 点击数:24131 引言 在成像光学系统设计中,主要指的是透镜系统设计,当然也有一些反射系统或棱镜系统. 在透镜系统设计中,最基 ...

  8. MYSQL数据库周德伟教程后题_《MySQL数据库基础实例教程》编者:周德伟,覃国蓉著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 编者:周德伟,覃国蓉著 出版社:人民邮电出版社 出版时间:2017-08-01 版次:1 开本:16开 装帧:平装 ISBN:9787115461872 版权提供:人民邮电出版社 基 ...

  9. python零基础实例-零基础学习Python开发练习100题实例(1)

    零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2864浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...

最新文章

  1. Vue创建组件的三种方式
  2. 什么是Express.js?
  3. Sqlite表的结构修改
  4. RocketMq Consumer 最佳实践
  5. 具体knn算法概念参考knn代码python实现
  6. vaadin_Vaadin和DukeScript中的Hello World
  7. 剑指offer:63-66记录
  8. activiti5第六弹 手动任务、接收任务、邮件任务
  9. 使用 docker+tmux 加强容器调度
  10. linux操作系统基础篇(四)
  11. 3 年大厂工作经验面试竟然要我手写 atoi 函数
  12. BZOJ1497: [NOI2006]最大获利
  13. Python实现快乐的数字
  14. 【学习技巧和心得】 - 如何将学习资源转化成图文笔记?
  15. HDU 1728 优化的BFS
  16. 【Monkey测试】Monkey测试详解
  17. VisualVM工具介绍
  18. css清除浮动float
  19. 由学生学号查询该学生对应的课表--查询函数
  20. GOM引擎单机架设配置教程

热门文章

  1. python练习题及答案-python编程练习题和答案.doc
  2. python电脑下载-PC端数据下载软件开发(Python)
  3. 零基础自学python-零基础如何自学成为Python高手?
  4. python是什么软件-学习python用什么软件
  5. python有哪些用途-Python语言有哪些用途
  6. 语音识别asr是什么
  7. JAVA基础知识之Collections工具类
  8. 曲线组合图 类型详情
  9. java md5算法_JAVA实现MD5算法
  10. Javascript预解析、代码执行