简单的玻璃材质效果——UnityShader学习笔记
文章目录
- 自言自语
- 一、效果
- 二、Shader(Builltin)
- 三、修改版来了
- 效果
- Shader
- 总结
自言自语
最近一直工作比较忙,但也没有放弃shader学习,今天又从同事那里GET到了一个效果,比较简单,但是效果还不错。性价比应该还不错。笔记下来,以后可以拿来用用。 不过自己计算的改动就是没啥道理。所以要论证理论正确性可能是没有的。不过我是美术,好看就完事儿了。
一、效果
二、Shader(Builltin)
Shader "TNShaderPractise/GlassBottle"
{Properties{_MainTex ("Texture", 2D) = "black" {}_MainTex2 ("Texture2", 2D) = "black" {}_MaskTex ("_MaskTex", 2D) = "black" {}_MatCap01Pow("_MatCap01Pow",Float)=1_refract("_refract",Float) =1[HDR]_refacColor("_refacColor",Color)=(0,0,0,1)}SubShader{Tags { "RenderType"="Transparent" "Queue" = "Transparent"}Pass{Blend SrcAlpha OneMinusSrcAlphaCull OffZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct a2v{float4 vertex : POSITION;half3 normal : NORMAL;float2 texcoord : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;half3 normalWS : TEXCOORD1; float4 pos : SV_POSITION;float4 posWS : TEXCOORD2;float4 vPOS : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST; sampler2D _MainTex2;float4 _MainTex2_ST; sampler2D _MaskTex;float4 _MaskTex_ST;float _MatCap01Pow;float _refract;float4 _refacColor;v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.posWS = mul(unity_ObjectToWorld,v.vertex);o.normalWS = UnityObjectToWorldNormal(v.normal);o.uv = v.texcoord;o.vPOS = o.posWS - v.vertex;return o;}fixed4 frag (v2f i) : SV_Target{half3 viewDir = normalize(UnityWorldSpaceViewDir(i.posWS));half3 normalVS = normalize(mul(UNITY_MATRIX_V,i.normalWS));//改进版matCapUVfloat3 posVS = normalize(mul(UNITY_MATRIX_V,i.posWS));normalVS = cross(posVS,normalVS);normalVS.y = - normalVS.y;half thickMask = tex2D (_MaskTex,i.uv).g;half NdotV = abs(dot(i.normalWS,viewDir));half fresnel = smoothstep(1,0,NdotV);fresnel = fresnel+thickMask;float uvOffset = fresnel*_refract;float2 matCapUV = normalVS.yx*0.5+0.5;float2 matCapUV2 = uvOffset+matCapUV;half4 matCap01 = tex2D(_MainTex,matCapUV)*_MatCap01Pow;half4 matCap02 = tex2D(_MainTex2,matCapUV2);matCap02 = lerp (_refacColor*0.5,_refacColor*matCap02,clamp(0,1,uvOffset));float alpha = saturate(max(matCap01.r,fresnel*fresnel));half4 col = matCap01+ matCap02;return float4(col.rgb,alpha);}ENDCG}}FallBack "Diffuse"
}
三、修改版来了
效果
Shader
Shader "TNShaderPractise/GlassBottle"
{Properties{_MainTex ("Texture", 2D) = "black" {}_MainTex2 ("Texture2", 2D) = "black" {}_MaskTex ("_MaskTex", 2D) = "black" {}_MatCap01Pow("_MatCap01Pow",Float)=1_refract("_refract",Float) =1[HDR]_refacColor("_refacColor",Color)=(0,0,0,1)_DecalTex ("DecalTex",2D) = "black"{} [HDR]_DecalColor("DecalColor",Color)=(1,1,1,1)}SubShader{Tags { "RenderType"="Transparent" "Queue" = "Transparent"}Pass{Blend SrcAlpha OneMinusSrcAlphaCull FrontZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct a2v{float4 vertex : POSITION;half3 normal : NORMAL;float2 texcoord : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;half3 normalWS : TEXCOORD1; float4 pos : SV_POSITION;float4 posWS : TEXCOORD2;float4 vPOS : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST; sampler2D _MainTex2;float4 _MainTex2_ST; sampler2D _MaskTex;float4 _MaskTex_ST; sampler2D _DecalTex;float4 _DecalTex_ST;float4 _DecalColor;float _MatCap01Pow;float _refract;float4 _refacColor;v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.posWS = mul(unity_ObjectToWorld,v.vertex);o.normalWS = UnityObjectToWorldNormal(v.normal);o.uv = v.texcoord;o.vPOS = o.posWS - v.vertex;return o;}fixed4 frag (v2f i) : SV_Target{half3 viewDir = normalize(UnityWorldSpaceViewDir(i.posWS));half3 normalVS = normalize(mul(UNITY_MATRIX_V,i.normalWS));//改进版matCapUVfloat3 posVS = normalize(mul(UNITY_MATRIX_V,i.posWS));normalVS = cross(posVS,normalVS);normalVS.y = - normalVS.y;half thickMask = tex2D (_MaskTex,i.uv*_MaskTex_ST.xy+_MaskTex_ST.zw).g;half NdotV = abs(dot(i.normalWS,viewDir));half fresnel = smoothstep(1,0,NdotV);fresnel = fresnel+thickMask;float uvOffset = fresnel*_refract;float2 matCapUV = normalVS.yx*0.5+0.5;float2 matCapUV2 = uvOffset+matCapUV;half4 matCap01 = tex2D(_MainTex,matCapUV)*_MatCap01Pow;half4 matCap02 = tex2D(_MainTex2,matCapUV2);half4 Decal = tex2D(_DecalTex,i.uv*_DecalTex_ST.xy+_DecalTex_ST.zw)*_DecalColor;matCap02 = lerp (_refacColor*0.5,_refacColor*matCap02,clamp(0,1,uvOffset));float alpha = saturate(max(matCap01.r,fresnel*fresnel));float alphaDecal = smoothstep(0,0.1,Decal.r);half4 col = matCap01+ matCap02;col = lerp(col,Decal,alphaDecal);float finalAlpha = lerp(alpha,alphaDecal,alphaDecal);return float4(col.rgb,finalAlpha);}ENDCG}Pass{Blend SrcAlpha OneMinusSrcAlphaCull BackZWrite OffCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct a2v{float4 vertex : POSITION;half3 normal : NORMAL;float2 texcoord : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;half3 normalWS : TEXCOORD1; float4 pos : SV_POSITION;float4 posWS : TEXCOORD2;float4 vPOS : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST; sampler2D _MainTex2;float4 _MainTex2_ST; sampler2D _MaskTex;float4 _MaskTex_ST; sampler2D _DecalTex;float4 _DecalTex_ST;float4 _DecalColor;float _MatCap01Pow;float _refract;float4 _refacColor;v2f vert (a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.posWS = mul(unity_ObjectToWorld,v.vertex);o.normalWS = UnityObjectToWorldNormal(v.normal);o.uv = v.texcoord;o.vPOS = o.posWS - v.vertex;return o;}fixed4 frag (v2f i) : SV_Target{half3 viewDir = normalize(UnityWorldSpaceViewDir(i.posWS));half3 normalVS = normalize(mul(UNITY_MATRIX_V,i.normalWS));//改进版matCapUVfloat3 posVS = normalize(mul(UNITY_MATRIX_V,i.posWS));normalVS = cross(posVS,normalVS);normalVS.y = - normalVS.y;half thickMask = tex2D (_MaskTex,i.uv*_MaskTex_ST.xy+_MaskTex_ST.zw).g;half NdotV = abs(dot(i.normalWS,viewDir));half fresnel = smoothstep(1,0,NdotV);fresnel = fresnel+thickMask;float uvOffset = fresnel*_refract;float2 matCapUV = normalVS.yx*0.5+0.5;float2 matCapUV2 = uvOffset+matCapUV;half4 matCap01 = tex2D(_MainTex,matCapUV)*_MatCap01Pow;half4 matCap02 = tex2D(_MainTex2,matCapUV2);half4 Decal = tex2D(_DecalTex,i.uv*_DecalTex_ST.xy+_DecalTex_ST.zw)*_DecalColor;//志诚大佬纠正我透明度取值的问题 提出用灰度计算不会影响后边的颜色计算half DecalAlpha = Decal.r*0.2125+Decal.g*0.7154+Decal.b*0.0721;matCap02 = lerp (_refacColor*0.5,_refacColor*matCap02,clamp(0,1,uvOffset));float alpha = max(matCap01.r,fresnel*fresnel);float alphaDecal = smoothstep(0,0.08,DecalAlpha);half4 col = matCap01+ matCap02;col = lerp(col,Decal,alphaDecal);float finalAlpha = lerp(alpha,alphaDecal,alphaDecal);return float4(col.rgb,finalAlpha);}ENDCG}}FallBack "Diffuse"
}
总结
继续加油
简单的玻璃材质效果——UnityShader学习笔记相关推荐
- 模板测试+一个好玩的顶点动画效果——UnityShader学习笔记
文章目录 一.自言自语 效果 模板测试效果(图传错了就懒得继续换了) 模板测试代码 顶点动画面板 顶点动画效果 顶点动画shader代码 总结 一.自言自语 嗯,又是很久没写笔记了.学习的进度和效率没 ...
- 带顶点动画的护盾效果——UnityShader学习笔记
文章目录 自言自语 一.效果 二.C# 三.Shader 总结 自言自语 最近又是很久没有更新笔记了.原因有二. 一.最近一直再啃一个看起来酷炫的护盾效果 啃了好久啊.直至效果满意 也理解了. 这个是 ...
- 方块粒子动画效果——UnityShader学习笔记
文章目录 自言自语 一.效果和面板 二.Shader 总结 自言自语 很早以前学B站一个UP主的东西.今天突然想起来.果然发现看不懂了.不理解了.然后自己又啃了一遍.总算理解了.并且发现了一些不合适的 ...
- Unity-shader学习笔记(七)
文章目录 Unity-shader学习笔记(七) 15 更复杂的光照 15.1 Unity的渲染路径 15.1.1 前向渲染路径 15.1.1.1 前向渲染路径的原理 15.1.1.2 Unity中的 ...
- Unity材质球个人学习笔记
Unity材质球个人学习笔记 Shader FX: Lighting and glass effects.( 灯光.玻璃) GUI and UI: For user interface graphic ...
- UnityShader学习笔记:Caustic水纹焦散与鱼群制作水族馆
UnityShader学习笔记:Caustic水纹焦散 贴图 代码部分 关于聚散色彩分离的疑惑 鱼群动画 本文教程原地址:https://www.alanzucconi.com/2019/09/13/ ...
- 消散效果shader实践含clip阴影pass——UnityShader学习笔记
文章目录 自言自语 一.效果部分 二.Shader部分 总结 自言自语 消融效果shader学习练习笔记 没啥可说得了 写完看不见模型了 ORZ 然后晚上回来把绕不明白的几个函数给绕明白了...再加上 ...
- 简单的builltin下的PBRshader手撸练习——UnityShader学习笔记
文章目录 自言自语 一.截图效果 二.shader 总结 自言自语 又是很久没有写笔记了.因为一直在啃PBR.总算在昨晚算是啃通了一遍.不过这只是个简单的builltin下的相对简单的PBR框架的sh ...
- 玉石效果?——UnityShader学习笔记
文章目录 自言自语 一.效果 第一版效果 第二版效果 二.Shder 总结 自言自语 shader的能做的效果太多,又学习一种方法做了个效果.但总感觉不是那么回事儿.. 先笔记下吧 又更新了一下 调整 ...
- 基金投资好简单,从入门到精通 -学习笔记day1
本系列笔记是我通过在喜马拉雅平台,跟随"威尼斯摆渡人"出品的"基金投资好简单,入门到精通"系列时学习记录的笔记,如果大家对基金投资感兴趣,并不知道怎么入手的话, ...
最新文章
- matlab的dft谱分析,数字信号处理基于matlab(用DFT作谱分析,窗函数的设计)
- Linux 进程管理命令之pidof
- 数据存储方案-闭包表
- Oracle数据库管理›oracle内部的jdk版本
- 编程常用英语词汇 | GitHub
- 神秘七年、融资23亿美元,Magic Leap终于发售首款产品,被吐槽full of shit
- android 5.0 字体,QC8916 修改系统默认字体(Android 5.0)
- 试题18 四平方和(枚举法)
- Mybatis中是否需要依赖配置文件的名称要和mapper接口的名称一致 params错误
- MongoDB数据库操作和程序基础文档
- 计算机辅助药物设计中的分子动力学模拟
- Hello, CSDN
- 如何利用excel中的数据源制作数据地图
- Leetcode 1653. Minimum Deletions to Make String Balanced [Python]
- Elasticsearch 之(6)kibana嵌套聚合,下钻分析,聚合分析
- 凸优化学习笔记 6:共轭函数
- .sh执行文件sed命令出错 bad flag in substitute command: ‘U‘ Mac终端
- 打赢下一场游戏大战!PlayStation能满足玩家一切需求?
- IMDB影评数据集无法通过keras下载
- .py文件图标为白纸以及右键没有Edit with IDLE的解决办法