UnityShader9.1:光照基础实例
前置: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:光照基础实例相关推荐
- UnityShader9:光照基础回顾
一.需要提前了解的 基于经验的基础光照,相比于后面物理光照的学习,简单不少: 光照基础:https://blog.csdn.net/Jaihk662/article/details/106624451 ...
- python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...
本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...
- 一:FPGA从入门倒入坟-第一个基础实例蜂鸣器
FPGA从入门倒入坟-第一个基础实例蜂鸣器 声明 代码 逻辑代码(.V文件) 端口约束文件(.UCF文件) 相关程序关键字解释 声明 本小白使用的是***Xilinx Spartan6***系列的开发 ...
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--低级建模的基础实例(七)
声明:本文为原创作品,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 第三章 ...
- 《地理信息系统基础实例操作100例》-实验15 设置字段属性域(无法创建要素问题)
<地理信息系统基础实例操作100例>-实验15 设置字段属性域(无法创建要素问题) 零.观前须知 一.基本流程 二.所遇问题 三.解决方法(之一) (一)ArcCatalog操作 (二)A ...
- ProgressBar(进度条)-常用属性讲解与基础实例
本节给大家带来的是Android基本UI控件中的ProgressBar(进度条),ProgressBar的应用场景很多,比如用户登录时,后台在发请求,以及等待服务器返回信息,这个时候会用到进度条:或者 ...
- zemax操作例子_ZEMAX基础实例 - 单透镜设计
ZEMAX基础实例 - 单透镜设计 说明 日期:2011年11月17日 点击数:24131 引言 在成像光学系统设计中,主要指的是透镜系统设计,当然也有一些反射系统或棱镜系统. 在透镜系统设计中,最基 ...
- MYSQL数据库周德伟教程后题_《MySQL数据库基础实例教程》编者:周德伟,覃国蓉著【摘要 书评 在线阅读】-苏宁易购图书...
商品参数 作者: 编者:周德伟,覃国蓉著 出版社:人民邮电出版社 出版时间:2017-08-01 版次:1 开本:16开 装帧:平装 ISBN:9787115461872 版权提供:人民邮电出版社 基 ...
- python零基础实例-零基础学习Python开发练习100题实例(1)
零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2864浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...
最新文章
- Vue创建组件的三种方式
- 什么是Express.js?
- Sqlite表的结构修改
- RocketMq Consumer 最佳实践
- 具体knn算法概念参考knn代码python实现
- vaadin_Vaadin和DukeScript中的Hello World
- 剑指offer:63-66记录
- activiti5第六弹 手动任务、接收任务、邮件任务
- 使用 docker+tmux 加强容器调度
- linux操作系统基础篇(四)
- 3 年大厂工作经验面试竟然要我手写 atoi 函数
- BZOJ1497: [NOI2006]最大获利
- Python实现快乐的数字
- 【学习技巧和心得】 - 如何将学习资源转化成图文笔记?
- HDU 1728 优化的BFS
- 【Monkey测试】Monkey测试详解
- VisualVM工具介绍
- css清除浮动float
- 由学生学号查询该学生对应的课表--查询函数
- GOM引擎单机架设配置教程