菲涅尔反射描述了一种光学现象,当光照到物体表面时,一部分发生反射,另一部分则进入物体内部,发生折射或散射;相比直接的反射和折射计算,菲涅尔反射更接近真实情况。

可用下面的等式近似计算这种反射效果:

F=F0+(1-F0)*pow((1-dot(v,n)),p);

其中,F0为反射系数,v为视野方向,n为法线方向,p为控制指数,一般p=5。

代码如下:

 1 Shader "MyUnlit/FresnelReflection"
 2 {
 3     Properties
 4     {
 5         _Color("Color Tint", Color) = (1,1,1,1)
 6         _ReflectColor("Reflection Color",Color) = (1,1,1,1)
 7         _FresnelScale("Fresnel Scale",range(0,1)) = 0.5
 8         _CubeMap("Reflection CubeMap",cube) = "_skybox"{}
 9     }
10         SubShader
11     {
12         Tags{ "RenderType" = "Opaque" }
13
14         Pass
15     {
16         Tags{ "lightmode" = "forwardbase" }
17
18         CGPROGRAM
19         #pragma multi_compile_fwdbase
20         #pragma vertex vert
21         #pragma fragment frag
22
23         #include "UnityCG.cginc"
24         #include "autolight.cginc"
25         #include "lighting.cginc"
26
27         fixed4 _Color;
28         fixed4 _ReflectColor;
29         fixed _FresnelScale;
30         samplerCUBE _CubeMap;
31
32     struct appdata
33     {
34         float4 vertex : POSITION;
35         float3 normal:NORMAL;
36     };
37
38     struct v2f
39     {
40         float3 worldPos : TEXCOORD0;
41         float4 pos : SV_POSITION;
42         float3 worldNormal:TEXCOORD1;
43         float3 worldViewDir:TEXCOORD2;
44         float3 worldRef:TEXCOORD3;
45         SHADOW_COORDS(4)
46     };
47
48     v2f vert(appdata v)
49     {
50         v2f o;
51         o.pos = UnityObjectToClipPos(v.vertex);
52         o.worldNormal = UnityObjectToWorldNormal(v.normal);
53         o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
54         o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
55         o.worldRef = reflect(-o.worldViewDir, o.worldNormal);
56
57         TRANSFER_SHADOW(o);
58         return o;
59     }
60
61     fixed4 frag(v2f i) : SV_Target
62     {
63         fixed3 worldNormal = normalize(i.worldNormal);
64         fixed3 worldViewDir = normalize(i.worldViewDir);
65         fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
66
67         fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
68         fixed3 col = texCUBE(_CubeMap, i.worldRef).rgb;
69         fixed3 reflection = col * _ReflectColor.rgb;
70
71         fixed3 diffuse = _LightColor0.rgb*_Color.rgb*saturate(dot(worldNormal, worldLightDir));
72         fixed fresnel = _FresnelScale + (1 - _FresnelScale)*pow(1 - dot(worldViewDir, worldNormal), 5);
73
74         UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
75         fixed3 color = ambient + lerp(diffuse, reflection, saturate(fresnel))*atten;
76         return fixed4(color,1.0);
77     }
78         ENDCG
79     }
80     }
81         fallback "Reflective/VertexLit"
82 }

转载于:https://www.cnblogs.com/koshio0219/p/11104808.html

Unity Shader 菲涅尔环境反射相关推荐

  1. unity shader 菲涅尔效果

    老样子,还是先上效果图: 菲涅尔效果的原理大家可以自己去百度看看,网上有很多,这里就不多说了,我们直接看如何实现这个效果 实现思路: 1.求得视角方向,法线方向(世界空间下) 2.根据菲涅尔效果的公式 ...

  2. 庄懂的TA笔记(九)<菲涅尔 + MatCap + CubeMap>

    庄懂的TA笔记(九)<菲涅尔 + MatCap + CubeMap> 课程内容: 1.菲涅尔 0.效果展示.公式: 菲涅尔现象:  Fresnel(菲涅尔) 用到的两个向量  NdirWS ...

  3. 学习笔记(二):WiFi-无接触感知与菲涅尔区

    学习笔记(二):WiFi-无接触感知与菲涅尔区 <毫米级的 Wi-Fi 无接触感知:从模式到模型>笔记 整体总结:   本文在理论上揭示和评估什么样的人体行为可被检测以及何时被检测到.具体 ...

  4. 菲涅尔区,前后比,VSWR

    1.菲涅尔区 对于垂直化天线系统,波从奇数菲涅尔区反射时产生的信号更强,偶数则弱. 对于水平化天线系统,波从奇数菲涅尔区反射时产生的信号更弱,偶数则强. 2.后瓣 辐射方向与主瓣相反 3.前后比 主瓣 ...

  5. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

    综合效果 经过各元素叠加 和 程序的审美调参 后的综合效果 交互的水波与边缘浪花的合并需要优化一下 反射 两种方案: cubeMap 以水面对称设一个摄像机 cubeMap 实现:反射探针生成Cube ...

  6. Unity shader Note :高级纹理(CubeMap反射折射菲涅尔,Rendermap镜子玻璃,程序纹理)

    1.Cubemap–反射折射 使用脚本来创建Cubemap ①通过Camera.RenderToCubemap 把任意位置观察到的场景图制作成一张Cubemap之中 ②脚本使用自定义编译窗体的命令 – ...

  7. Unity Shader:实现菲涅尔+色散效果的环境映射以及相关原理解析

    文章目录 1,色散在光学中的原理 2,反射的数学计算方法以及用它实现环境映射 3,折射的原理以及色散的实现 4,菲涅尔效果 5,拥有菲涅尔与色散效果的环境映射 1,色散在光学中的原理 复色光 --现实 ...

  8. Unity Shader:实现菲涅尔+色散效果以及相关原理解析

    1,色散在光学中的原理  2,反射的原理以及环境映射的实现  3,折射的原理以及色散的实现  4,菲涅尔效果  5,将菲涅尔与色散效果增加到环境映射中 1,色散在光学中的原理 复色光  --现实生活中 ...

  9. Physics CG:菲涅尔(fresnel)反射

    这一篇是物理学CG的开篇,其实我多开了一个分类也是心理无奈的,自身水平有限,而很多物理图形学知识积累太少,有些甚至根本没学过.然而高级图形学知识中,或者说高级图形着色效果中,很大一部分是基于" ...

  10. Shader学习21——基于菲涅尔透明的扫描线

    看到人家这样的一个效果,于是想自己也复制一个 Mar-26-2021 17-16-26.gif 想了一下思路,应该是菲涅尔的做的一个透明效果(单纯的菲涅尔透明可以看这篇),再去做了一个线的效果,线应该 ...

最新文章

  1. html Qestionnaire表单
  2. flask查询User,返回对象列表,提示ypeError: Object of type ‘bytes‘ is not JSON serializable解决办法
  3. ubuntu18.04虚拟机突然连不上网
  4. [前端]npm安装慢,换用淘宝的镜像
  5. 3D渲染和动画制作KeyShot Pro for mac
  6. linux 应用程序 死锁,程序死锁了
  7. 阿里云ICON全部下载
  8. 【matlab 图像处理】双边滤波高斯滤波
  9. matlab状态反馈控制器设计,状态反馈控制器设计方案书.doc
  10. 实现B站弹幕很难么?这个开源项目了解一下
  11. c语言测试单句代码运行时间,c语言测试代码的运行时间
  12. matlab中列主元三角分解法的函数,[数值算法]列主元三角分解法
  13. Unity mesh换装
  14. Docker 文件映射
  15. JS实现waterfall
  16. QT随机放1个1和七个2_才知道,1个橙子放2个鸡蛋,只要拌一拌,出锅孩子吃了提高免疫力|橙子|鸡蛋|蒸蛋|食盐|白糖...
  17. 为什么在线客服系统很重要
  18. python爬取论文全文数据_Python爬取微信公众号历史文章进行数据分析
  19. lsdyna进阶教程-弹性球撞击刚性平板
  20. 什么叫做POJO类?

热门文章

  1. 一次线上商城系统高并发优化,涨姿势了~
  2. CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了
  3. 网易开源分布式存储系统 Curve,性能彪悍!这是要吊打阿里?
  4. python查找第k大的数_Python实现查找二叉搜索树第k大的节点功能示例
  5. Linux进阶之给nginx设置登录用户验证
  6. DOCTYPE用法详解
  7. JS生成随机的字母数字组合的字符串
  8. Python入门+进阶 第1章 Python入门导学(无论何时,只要开始就不晚)
  9. Shell编程之条件判断
  10. 使用C#来手动连接 Access 2007数据库