一、公式
specuColor = Kd*_LightColor0*pow(max(R·V 0), _Shininess);
Kd–环境光颜色、顶点颜色、点光源的距离衰减
_LightColor0–光源颜色
R·V–反射光向量 · 观察向量

二、逐顶点着色(古罗着色)

Shader "Custom/MySpecular_Vertex"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Bright("Bright",Float) = 2_Shininess("Shininess",Float) = 10}SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"uniform float _Shininess;uniform float _Bright;uniform sampler2D _MainTex;struct appdata{float4 vertex:POSITION;float2 texcoord:TEXCOORD0;half3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;fixed4 difColor : COLOR0;fixed4 specuColor : COLOR1;};v2f vert(in appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;float3 vertexWorldPos = mul(unity_ObjectToWorld, v.vertex);float3 N = normalize(mul((float3x3)unity_ObjectToWorld, v.normal));//法线float3 L;//入射光方向float atten;//点光源的距离衰减系数if (_WorldSpaceLightPos0.w == 0)//_WorldSpaceLightPos0:平行光: (world space direction, 0);{L = normalize(_WorldSpaceLightPos0);atten = 1;}else //_WorldSpaceLightPos0: 其他光: (world space position, 1).{float3 light2Vertex = _WorldSpaceLightPos0 - vertexWorldPos;L = normalize(light2Vertex);float Length = length(light2Vertex);atten = 1 / Length;}float Kd = atten*_Bright/**UNITY_LIGHTMODEL_AMBIENT*/;//计算入射光和法线的夹角的余弦值,并剔除小于零的值(小于0的值相当于从物体的背面向物体表面照射,没有物理意义)float cos = max(dot(N, L), 0);fixed4 difColor = Kd*_LightColor0 *cos;//漫反射光的颜色//镜面反射float3 R = reflect(-L, N);float3 V= normalize(_WorldSpaceCameraPos - vertexWorldPos);fixed4 specuColor = Kd* _LightColor0*pow(max(dot(R, V), 0), _Shininess);o.difColor = difColor;o.specuColor = specuColor;return o;}fixed4 frag(in v2f i) :SV_Target{fixed4 col;//纹理采样col = tex2D(_MainTex, i.uv);col *= i.difColor;col += i.specuColor;return col;}ENDCG}}
}

三、逐像素着色(冯式着色)

Shader "Custom/MySpecular_Fragment"
{Properties{_MainTex("Texture", 2D) = "white" {}_Bright("Bright",Float) = 2_Shininess("Shininess",Float) = 10}SubShader{Tags{ "RenderType" = "Opaque" }LOD 100Pass{Tags{ "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"uniform float _Shininess;uniform float _Bright;uniform sampler2D _MainTex;struct appdata{float4 vertex:POSITION;float2 texcoord:TEXCOORD0;float3 normal:NORMAL;};struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;float3 normalDir:TEXCOORD1;float3 worldPos:TEXCOORD2;};v2f vert(in appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;o.normalDir = normalize(mul((float3x3)unity_ObjectToWorld, v.normal));o.worldPos = mul((float3x3)unity_ObjectToWorld, v.vertex);return o;}fixed4 frag(in v2f i) :SV_Target{fixed4 col;col = tex2D(_MainTex, i.uv);float3 N = normalize(i.normalDir);float3 L;float atten;if (_WorldSpaceLightPos0.w == 0){L = normalize(_WorldSpaceLightPos0);atten = 1;}else{float3 light2Vertex = _WorldSpaceLightPos0 - i.worldPos;L = normalize(light2Vertex);float Length = length(light2Vertex);atten = 1 / Length;}float Kd = atten*_Bright;float4 difColor = Kd*_LightColor0*max(0, dot(N, L));float3 R = reflect(-L, N);float3 V = normalize(_WorldSpaceCameraPos - i.worldPos);float4 specuColor = Kd*_LightColor0*pow(max(dot(R,V), 0), _Shininess);col *= difColor;col += specuColor;return col;}ENDCG}}
}

Unity 镜面反射相关推荐

  1. unity 镜面反射_Unity | Diffuse Light漫反射光照

    Hello all 今天跟大家唠一下unity shader中的diffuse 是我木偶心没 我们在游戏开发的过程中光照是必不可少的,而为了使游戏更加真实,获得更好的体验,也会模拟因光照产生的各种镜面 ...

  2. 《Unity着色器和屏幕特效开发秘笈》—— 第3章 利用镜面反射让游戏闪耀起来...

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第3章,第3.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  3. Unity Shader - 实现类似镜面反射、水面扰动效果

    前几天,家里出了一些问题,搞得心情很不好,面试我也取消了. 唉,反正那个伤心啊,不过,昨天处理好了. 所以说啊,家和万事兴. 加油加油!!! 所以心情好了,我又写博客了. 另外说一下:图形我今年201 ...

  4. Unity实现镜面反射效果

    1.准备工作 ①创建一个Sphere为发射点,添加LineRenderer组件. ②调整LineRenderer组件下的宽度属性: 当然想更好看些可以添加个材质修改个颜色啥的. ③最后随便创建几个Cu ...

  5. Unity 关于镜面反射和投影阴影实现

    话不多说先上图,有镜面反射,投影器方式实现阴影,下雨效果,工程放最后 镜面反射 镜面反射原理:通俗点说法就是就是在摄象机对称的正下方和主摄象机看同一个焦点,这个反射摄象机看到的东西就是镜面反射的东西, ...

  6. Unity使用反射探头实现地面的镜面反射

    最近在看之前的愤怒机器人demo,它的反射通过一个反射相机实现 我尝试在unity5里用反射探头做出镜面反射,但想要调的准确倒是比较难.. .. 后来朋友发我一份反射探头实现镜面反射的文章,解决了这个 ...

  7. Unity镜子效果的实现(无需镜子Shader)

    Unity镜子效果制作教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  8. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  9. 关于Unity中Shader的内置值

    Unity provides a handful of builtin values for your shaders: things like current object's transforma ...

最新文章

  1. Science:AI领域那么多引人注目的「进展」,竟是无用功
  2. android 下拉刷新 组件,android系统自带下拉刷新控件的实现
  3. matlab---spectrogram短时傅里叶变换与chrip信号
  4. OpenGL mipmap filters贴图过滤的实例
  5. 阶乘之和计算_利用MULTINOMIAL函数计算参数和的阶乘与各参数阶乘乘积的比 值
  6. @产品部 -- 腾讯策划部是如何培养用户的《王者荣耀》“瘾”的
  7. Java LocalDate类| minusYears()方法与示例
  8. SOA为什么不“香”了? | 大咖说中台
  9. 关于生命周期函数dealloc的使用小结
  10. 计算机网络 校园网规划,计算机网络课程校园网规划设计
  11. x3-02 java,Android Studio 3.2.1 - 新项目无法运行
  12. 设计模式解密(9)- 装饰者模式
  13. 手机如何双声道录音_如何在手机端实现电话录音功能?
  14. 外部中断控制LED灯开关
  15. 互联网众筹系统开发-一站式搭建众筹项目建设
  16. JS - 4 - 数组 Array - API(slice、splice、shift、)
  17. 网络协议总结(TCP,UDP,HTTP,HTTPS)
  18. 2022年湖南省自考考试学前教育幼儿园课程练习题及答案
  19. 如何在电脑上看微信阅读
  20. CDN-直播-点播-技术简介

热门文章

  1. 程序员代码面试指南刷题--第五章.翻转字符串(1)
  2. 一些热门的前端UI组件库(附用例)
  3. 树莓派计算模块CM4搭建软路由OpenWrt+OpenClash过程记录
  4. php实现清空购物车前确认,php – 在Woocommerce中添加到购物车之前清空购物车
  5. 微信小程序页面数量限制问题
  6. 批量微信过滤开通助手 急速微信筛选开通助手
  7. 解决页面favicon.ico文件不存在提示404问题
  8. java 画立体图形
  9. 在mtk移植个linux内核,移植 Linux Kernel 造成無法開機之解決方案以及除錯工具
  10. el-checkbox同时获取value 和 name