Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数
1 高光反射光照模型计算公式
从公式可以看出,要计算高光反射需要知道 4 个参数:入射光线的颜色和强度c,材质的光反射系数 m,视角方向v以及反射方向r。其中,反射方向r可以由表面法线n和光源i计算得到。
2 顶点着色器实现 - 高洛德着色
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "MyShader/Chapter6_SpecularVertexLevelMat"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(8.0,256)) = 20}SubShader{pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;//顶点着色器输入结构体struct a2v{fixed4 vertex : POSITION;//NORMAL语义告诉unity法线存到normalfloat3 normal : NORMAL;};//顶点着色器输出结构体,也是片原着色器的输入结构体struct v2f{float4 pos : SV_POSITION;fixed3 color : COLOR;};//顶点着色器实现高光反射v2f vert(a2v v){v2f o;//顶点转换到裁切空间o.pos = UnityObjectToClipPos(v.vertex);//获取环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//顶点法线转换到世界坐标系fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));//顶点获取当前光源法向量fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//计算漫反射颜色fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));//计算入射光线的反射方向fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));// 计算摄像机观察视角向量fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);//计算反射颜色fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);o.color = ambient + specular + diffuse;return o;}fixed4 frag(v2f i) : SV_Target {return fixed4(i.color, 1.0);}ENDCG}fallback "Specular"}
}
3 片元着色器实现——逐像素着色
Shader "MyShader/Chapter6_SpecularVertexLevelMat"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(8.0,256)) = 20}SubShader{pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;//顶点着色器输入结构体struct a2v{fixed4 vertex : POSITION;//NORMAL语义告诉unity法线存到normalfloat3 normal : NORMAL;};//顶点着色器输出结构体,也是片原着色器的输入结构体struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;};//顶点着色器实现高光反射v2f vert(a2v v){v2f o;//顶点转换到裁切空间坐标o.pos = UnityObjectToClipPos(v.vertex);//顶点法线转换到世界空间o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);//顶点位置转换到世界空间坐标o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target {//获取环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//顶点法线转换到世界坐标系fixed3 worldNormal = normalize(i.worldNormal);//顶点获取当前光源法向量fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//计算漫反射颜色fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));//计算入射光线的反射方向fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));// 计算摄像机观察视角向量fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);//计算反射颜色 pow(参数,指数)//材质的光泽度,也被称为反光度fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);return fixed4(ambient + diffuse + specular, 1.0);}ENDCG}}
}
4Phong光照模型 —— 最常用的光照模型
//计算漫反射颜色fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));//计算入射光线的反射方向fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));// 计算摄像机观察视角向量fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);//计算反射向量fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0,dot(worldNormal, halfDir)), _Gloss);return fixed4(ambient + diffuse + specular, 1.0);
5 Unity 封装的帮助函数
Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数相关推荐
- Unity Shader 学习记录(5) —— 实现漫反射光照模型
1 公式计算 从公式可以看出,要计算漫反射需要知道4 个参数:入射光线的颜色和强度 cgh"材质的漫反射系数mdiuse,表面法线n以及光源方向I. 为了防止点积结果为负值,我们需要使用ma ...
- unity shader 学习记录
记录下我学习unity shader的过程,并把我看到过的高质量教程推荐给大家! 借助插件shaderforge来熟悉着色的效果,并对照着shaderforge自动生成的shader代码手工优化和实现 ...
- Unity Shader学习记录(18) —— Shader动画
纹理动画 纹理动画在游戏中的应用非常广泛.尤其在各种资源都比较局限的移动平台上,我们往往会使用纹理动画来代替复杂的粒子系统等模拟各种动画效果. 11.2.1序列帧动画 _Time是float4类型, ...
- Unity Shader学习记录(15) —— Unity的光源类型
光源类型 Unity 一共支持4种光源类型:平行光.点光源.聚光灯和面光源 (area light).面光源仅在烘焙时才可发挥作用,因此不在本节讨论范围内.由于每种光源的几何定义不同,因此它们对应的光 ...
- Unity Shader 学习记录(3) —— CG语言和Shader文件
1 什么是语义 赋给shader的输入输出的字符串,表达了参数的含义.语义告诉shader从哪里获取数据,又把数据输出到哪里. 2 Shader的三种debug方法 1 假色彩图像 2 VStudio ...
- 【Unity Shader学习笔记】实现反射与折射模拟水面、使用grabPass与环境贴图
文章目录 写在前面 一个水波效果 大致组成部分与对应的实现方案 交界线与深度贴图 折射效果与GrabPass 使用Cubemap与法线信息来模拟反射 在正确的地点创建对应的cubemap 通过贴图获取 ...
- Unity shader学习-漫反射-兰伯特光照模型和半兰伯特光照模型
兰伯特漫反射公式:Diffuse = 直射光颜色 *物体颜色* max(0,cos夹角(光和法线的夹角) ) 下面给出顶点漫反射代码: Shader "Unlit/005" { ...
- unity shader学习---光照模型(二)
更复杂的光照 效果图 理论 unity的光源类型 unity的渲染路径 在这里插入图片描述 实验 多光源 阴影 不透明物体的阴影 让物体接收阴影 统-管理光照衰减和阴影 透明度物体的阴影 代码 多光源 ...
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
最新文章
- 网络摄像头+net_今日 Paper | 神经网络结构搜索;视觉目标;人物识别;视频3D人体姿态估计等...
- pycharm调出参数提示气泡
- 中国证券期货业南方信息技术中心二期约1.5万个机柜建设项目EPC总包定了!
- 实验报告一:词法分析
- 多项式乘法运算初级版
- 2020年市场最缺什么_2020年聚合氯化铝市场评述
- 83. 删除排序链表中的重复元素
- python建模仿真 matlab_清华大学出版社-图书详情-《仿真建模与MATLAB实用教程》
- linux 查看path文件,linux入门之环境变量与文件查找
- ue4 网络代码分析
- DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版
- 常用c语言代码大全,C经典程序代码大全.docx
- 一文图解自定义修改el-table样式
- 1064用ctype库解决
- rest-assured实战
- moectf chall 数独题 z3约束器求解
- 使用Zxing及豆瓣API
- 删除Linux中的.swp文件
- win10服务器cpu占用过高,完美解决:Win10资源管理器占用CPU过高
- android网络传输唤醒系统,Android手机唤醒群晖NAS系统
热门文章
- IT面试:三十六计(10)入职前准备
- 中小园区网配置案例 超详细
- Echarts之饼图制作
- 3个月学习成功上岗软件测试,我一个文科女也能吃IT饭了...
- 韩语 计算机术语,韩语计算机、互联网术语(1)
- Mysql 问题------解决1251 client does not support ...问题
- excel操作技巧:“自定义名称”应用基础篇
- 用html5看板娘,记在nuxt.js中引入一个萌哒哒的看板娘(Live2d模型)
- gstreamer学习笔记:将音视频合成MPEG2-TS流并打包通过rtp传输
- 数据库表空间大小查询