玻璃材质

要知道玻璃的实现原理那么首先要知道玻璃的原理

在现实世界的情况下:

1.在正常透明不模糊的玻璃下,透过玻璃看外界,基本上和不用玻璃没有太大差别。基本上就是透视。

2.在模糊的玻璃下,透过玻璃看外界,可以看到因为玻璃模糊导致透过玻璃看到的外界画面有点扭曲不清楚的感觉。这是一种模糊的扰动现象。

3.在漆黑的玻璃下,或者晚上,我们透过正常不模糊的玻璃看想外界时会发现看不到任何东西,反而看到的是自己在镜子里的样子。这是一种反射现象。

由上不同时间的玻璃影响可得到玻璃的三个效果,正常透视、模糊扰动、以及反射效果。

实现原理:

1.通过GrabPass得到我们屏幕中看到的画面,然后采样NormalMap贴图,进行扰动偏移,通过扰动偏移值采样GrabPass得到模糊扰动颜色。

2. 在通过采样CubeMap得到反射颜色。

3. 通过采样得到的模糊扰动颜色和反射颜色做个过度。

总结:
当扰动权重和法线强度为0时,玻璃为透视状态。
当扰动权重和法线图强度越大时,模糊扰动效果越强烈。
当不需要玻璃扰动时,就只有反射效果。

玻璃的三种效果

1.正常透视效果

2.模糊扰动效果


3.夜晚反射效果 因为视角的后面只有一个Cube和球体,所以反射的是下图2红框的效果:


玻璃后面

附上源码:

Shader "Unlit/Glass"
{Properties{_MainTex ("Texture", 2D) = "white" { }_BumpMap ("BunpMap", 2D) = "while" { }_BumpScale ("BumpScale", Range(0, 2)) = 0.5_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)_CubeMap ("CubeMap", Cube) = "_Skybox" { }_DisturbionInstensity ("DisturbionInstensity", Range(0, 100)) = 0.5  //扰乱程度_RefrationAmount("RefrationAmount", range(0, 1)) = 0.5//折射扰动程度}SubShader{//设置渲染顺序为最后渲染,这样抓到的屏幕图形则是在所有物体渲染完成后的图像Tags { "RenderType" = "Opaque" "Queue" = "Overlay" }LOD 100//定义抓屏通道  {"_GrabPassTexture"}  表示抓屏的名称,如果声明的抓屏的名称,只需在shader中在声明一下,Unity会自动把抓屏的图形填充到我们声明的_GradaPss中//如果不填写抓屏的名称,那么Unity就会默认使用_GrabTexture进行保存GrabPass{"_GrabPassTexture"}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct v2f{float4 vertex: SV_POSITION;float4 uv: TEXCOORD0;float4 temp1: TEXCOORD1;float4 temp2: TEXCOORD2;float4 temp3: TEXCOORD3;float4 srcPos: TEXCOORD4;};sampler2D _MainTex;fixed4 _MainTex_ST;sampler2D _BumpMap;fixed4 _BumpMap_ST;float _BumpScale;float4 _Diffuse;samplerCUBE _CubeMap;fixed _DisturbionInstensity;fixed _RefrationAmount;//抓屏Texture属性sampler2D _GrabPassTexture;fixed4 GrabPass_TexelSize;v2f vert(appdata_full v){//o.uv = TRANSFORM_TEX(v.uv, _GrabPassTexture);//因为采样得到的图片是反的所以我们这里翻转X轴//o.uv.x=1-o.uv.x;v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);//获取主贴图UVo.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);//获取法线贴图UV//计算屏幕空间o.srcPos = ComputeGrabScreenPos(o.vertex);float3 WorldPos = mul(unity_ObjectToWorld, v.vertex).xyz;//获取世界坐标float3 worldNormal = UnityObjectToWorldNormal(v.normal);//获取世界法线float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); //获取切线float3 WorldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;//获取副切线//按列摆放得到从切线空间到世界空间的旋转矩阵o.temp1 = float4(worldTangent.x, WorldBinormal.x, worldNormal.x, WorldPos.x);o.temp2 = float4(worldTangent.y, WorldBinormal.y, worldNormal.y, WorldPos.y);o.temp3 = float4(worldTangent.z, WorldBinormal.z, worldNormal.z, WorldPos.z);return o;}fixed4 frag(v2f i): SV_Target{// sample the texture//fixed4 col = tex2D(_GrabPassTexture, i.uv);//return col;//采样主贴图float3 albedo = tex2D(_MainTex, i.uv.xy).rgb * _Diffuse.rgb;//解析 参数float3 WorldPos = float3(i.temp1.w, i.temp2.w, i.temp3.w);//获取世界坐标float3 ViewDir = normalize(UnityWorldSpaceViewDir(WorldPos));//获取视角向量//采样法线贴图float4 normalPack = tex2D(_BumpMap, i.uv.zw);float3 tangentNormal = UnpackNormal(normalPack); //解压法线贴图tangentNormal.xy *= _BumpScale;//关联xy//切线空间转换到世界坐标float3 worldTangentNormal = normalize(float3(dot(i.temp1.xyz, tangentNormal), dot(i.temp2.xyz, tangentNormal), dot(i.temp3.xyz, tangentNormal))) ;//计算扰动偏移值fixed2 offest = tangentNormal.xy * _DisturbionInstensity * GrabPass_TexelSize.xy;i.srcPos.xy = offest * i.srcPos.z + i.srcPos.xy;//采样GrabPass并进行其次除法 因为裁剪空间并没有进行其次除法,我们要手动算出,不然得到的画面会很怪fixed3 refraColor = tex2D(_GrabPassTexture, i.srcPos.xy / i.srcPos.w);//fixed3 refraColor2 = texCUBE(_CubeMap,refract(-ViewDir,worldTangentNormal,_DisturbionInstensity)).rgb; //采样CubeMap  反射fixed3 refColor = texCUBE(_CubeMap, reflect(-ViewDir, worldTangentNormal)).rgb;//混合颜色  当折射为0 时显示反射+环境反射fixed3 color = ((1-_RefrationAmount)*refColor   +refraColor*_RefrationAmount)*albedo ;//这个公式可以增加玻璃的厚度,让玻璃更加明显,但弊端会有一些不该有的折射的东西,所以如果只追求折射扰动,可以使用,算是额外效果。//fixed3 color = ((1-_RefrationAmount)*refColor   +refraColor*_RefrationAmount +(1-_RefrationAmount*refraColor) )*albedo ; return fixed4(color, 1);}ENDCG}}
}

效果过就这个样子了,其中重要的 ,也就是GrabPass抓屏、计算扰动程度采样抓屏图和采样CubeMap得到反射颜色,最后进行融合。

当然,还有效果优化的空间。
如果有其中有不当处理或者误点欢迎大佬们指正错误。

努力积才能,壹叶便成名!

Unity Shader 玻璃材质相关推荐

  1. Unity Shader 玻璃效果

    一个玻璃效果主要分为两个部分,一部分是折射效果的计算,另一部分则是反射.下面分类进行讨论: 折射: 1.利用Grass Pass对当前屏幕的渲染图像进行采样 2.得到法线贴图对折射的影响 3.对采集的 ...

  2. 【备份】《Unity Shader入门精要》配图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  3. 【备忘】《Unity Shader入门精要》随书彩色插图

    转载来源:http://www.manew.com/blog-194008-42590.html <Unity Shader入门精要>随书彩色插图 <Unity Shader入门精要 ...

  4. 《Unity Shader入门精要》随书彩色插图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  5. 学习Shader Unity Shader 基础

    1.如何充分利用 Unity Shader 来为我们的游戏增光添彩? 材质和 Unity Shader: 在Unity中,我们需要配合使用材质(Material)和 Unity Shader 才能达到 ...

  6. Unity Shader入门精要——第3章 Unity Shader基础

    Unity Shader入门精要读书笔记系列 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader基础 文章目录 Unity Shader入门精要读书笔记系列 前言 ...

  7. 《 Unity Shader 入门精要》 第3章 Unity Shader 基础

    第3章 Unity Shader 基础 3.1 Unity Shader 概述 材质与 Unity Shader 在 Unity 中我们通常需要将材质(Material) 和 Unity Shader ...

  8. unity Shader

    unity Shader 前言 1 unity shader代码结构 1.1 shader命名 1.2 Properties语义块 1.3 SubShader 1.3.1 Pass 1.3.2 Sub ...

  9. Unity Shader入门精要第3 章 Unity Shader 基础

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity Shader 概述 二.使用步骤 1.3.1.2 Unity 中的材质 2.Unity 中的Shader 3.Unity ...

  10. 【猫猫的Unity Shader之旅】之玻璃材质

    今天我们用学过的Shader知识实现一个简单的玻璃材质. 首先,玻璃是半透明的 玻璃最主要的特点就是它是透明的,不同的玻璃有不同的不透明度,水杯的透明度比较低,而装药品的棕色玻璃瓶不透明度就比较高.当 ...

最新文章

  1. Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】
  2. CI配置文件 --------- autoload.php
  3. matlab信号内插,基于VC++和Matlab的数字信号内插处理系统
  4. jquery的开发版、mini版是的意思和使用场合
  5. 【java基础知识】设置表格内容居中显示,表格字体大小调整,表格列宽调整
  6. python将空格变成换行_Python基础之PEP8规范(代码写作规范)
  7. Docker学习总结(67)—— 取代 Dockerfile 的新型镜像构建技术 Buildpacks 详解
  8. 【ICPC 2021网络赛2】The 2021 ICPC Asia Regionals Online Contest (II)签到题5题
  9. java ing印版_Java TCP实现高仿版QQ聊天(二)
  10. sqlserver2005 安装图解教程以及SQL 2005 SP3补丁安装图文教程
  11. matlab二维正态分布图,MATLAB二维正态分布图
  12. 【考前必读】致PMI项目管理认证系列考试考生
  13. 库乐队历史版本怎么下载_ios库乐队旧版本下载
  14. 深度学习及机器学习整理--多谢各个网络大神
  15. xilinxFPGA-VGA时序+代码实现详解
  16. 深度学习基础知识---梯度弥散 梯度爆炸
  17. 为什么游戏需要热更新?
  18. jarvisoj level3
  19. linux strip作用,linux gcc strip命令简介
  20. dotnet 从入门到放弃的 500 篇文章合集

热门文章

  1. word插入对勾对号
  2. 如何查看自己阿里云服务器的ip地址
  3. 督查督办系统作用是什么
  4. 1.单例(Singleton)模式
  5. 金山wps支持java接口开发吗_金山wps开放平台使用踩坑实录
  6. 23种设计模式——最好理解的代理模式
  7. 网站运营的十二条盈利模式
  8. matlab正方形追及问题,行测常考题型讲解:环形相遇与追及问题
  9. Passenger简介
  10. Win 7 Office 2007,打开word出错