简单的玻璃材质效果——UnityShader学习笔记

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


自言自语

最近一直工作比较忙,但也没有放弃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 OneMinusSrcAlpha
            Cull Off
            ZWrite Off
            CGPROGRAM
            #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));
				//改进版matCapUV
				float3 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 OneMinusSrcAlpha
            Cull Front
            ZWrite Off
            CGPROGRAM
            #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));
				//改进版matCapUV
				float3 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 OneMinusSrcAlpha
            Cull Back
            ZWrite Off
            CGPROGRAM
            #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));
				//改进版matCapUV
				float3 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"
}

总结

继续加油

5分钟搞定!Unity中Matcap玻璃材质快速实现(含免费贴图资源) 本文详细介绍了在Unity中快速实现Matcap玻璃材质的方法,从技术原理到实战操作,包括Shader编写、参数调节和性能优化。通过Matcap技术,开发者可以高效创建逼真玻璃效果,特别适合移动端和快速迭代项目。文章还提供了免费贴图资源和进阶优化技巧,帮助提升视觉效果和运行效率。 阅读详情

相关推荐

Unity_使用Shader实现玻璃和镜面效果

使用Shader+Texture实现镜面效果

leikang111的博客 2112

Unity玻璃模糊效果Shader

Unity玻璃模糊效果Shader,直接赋值到材质球上进行使用即可。

unity中使用Matcap实现玻璃材质

Matcap(Material Capture)是一种渲染技术,用于在渲染过程中模拟具有真实光照效果材质。Matcap贴图通常为一张包含着光照等材质信息的球形纹理,以模型的的法线作为uv采样这张纹理,即可把材质映射到模型中,通常能够提供较优的性能效率。但由于这张纹理是基于预先捕获的光照信息,因此并不适用动态关照场景。

weixin_63115824的博客 2439

Fire Game

Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty

笑看风云起的专栏 1204

Unity Shader学习:玻璃材质

Unity Shader学习:玻璃材质 主要是通过反射和折射来达到透明的效果,用菲涅尔来混叠。 shader部分: Shader "Unlit/Crystal" { Properties { _Cube("Skybox",Cube)=""{} //折射角度 _EtaRatio("EtaRatio", Range(0, 1)) = 0 //菲涅尔系数 _FresnelBia...

咪咪博客 4319

Unity3D中玻璃、金属材质制作

1.首先创建一个材质球Glass 2.将材质球Inspector窗口中的Rendering Mode选为Transprent,这个选项可以使物体改变透明属性,并且带有反射。 3。接下来更改Metallic和Smoothness值,Metallic值越大金属光泽越明显,Smoothness值越大反射率就越大 所以如果需要玻璃材质则如下图设置: 但是这时候发现,玻璃球反射的光并不是周围的物体...

weixin_43778515的博客 3万+

Unity Shader 玻璃材质

玻璃材质 要知道玻璃的实现原理那么首先要知道玻璃的原理。 在现实世界的情况下: 1.在正常透明不模糊的玻璃下,透过玻璃看外界,基本上和不用玻璃没有太大差别。基本上就是透视。 2.在模糊的玻璃下,透过玻璃看外界,可以看到因为玻璃模糊导致透过玻璃看到的外界画面有点扭曲不清楚的感觉。这是一种模糊的扰动现象。 3.在漆黑的玻璃下,或者晚上,我们透过正常不模糊的玻璃看想外界时会发现看不到任何东西,反而看到的是自己在镜子里的样子。这是一种反射现象。 由上可以不同时间的玻璃影响可得到玻璃的三个效果,正常透视、模糊扰动、以

你只管努力,其他的,交给天意! 4779

(045)Unity材质玻璃

1.Rendering Mode 设置为 Transparent 。 2.Albedo 的 Alpha Channel 设置为 0。 3.Metallic 和 Smoothness 分别设置为 0 和 1。 资料 [1] Making a Glass Material in Unity

WGYHAPPY的博客 3148

Unity材质调节-金属、塑料、透明玻璃。​​

主要谈谈Unity中金属、塑料和透明玻璃类型 材质体现效果和设置。

weixin_64625272的博客 6238

UnityShader入门精要-渲染纹理 镜子 玻璃 效果

UnityShader入门精要-渲染纹理 镜子 玻璃 效果

weixin_58624886的博客 2140

UnityShader学习教程之<毛玻璃效果解析>

玻璃是很多项目需要的效果,以下是毛玻璃效果代码:Shader "Custom/WaterBlur" { Properties { _blurSizeXY("BlurSizeXY", Range(0,15)) = 2 } SubShader { Tags { "IgnoreProjector"="True"

xiongwen_li的博客 5172

UnityShader入门精要学习笔记】第十章 高级纹理(2)渲染纹理

摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即**渲染目标纹理(Render Target Texture ,RRT)** , 而不是传统的帧缓冲或者后备缓冲(back buffer,就是我们之前讲到的进行画面切换时,颜色缓冲重新渲染时需要使用的缓冲区)。与之相关的是**多重渲染目标(Multiple Render Target ,MRT)** 。这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中(例如4种渲染效果,正常情况

milu_ELK的博客 2037

UnityShader中级篇——玻璃效果

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'Uni...

weixin_37994402的博客 6153

UnityShader】使用Cubemap/Matcap制作玻璃

写在前面:写shader写累了就写写博客吧,每天都是充满bug的一天> < 使用版本:Unity3D 2019.4 (LTS) (LTS意思是长期支持,尽量选择LTS版本,兼容性比较好) 效果示意 Inspector Glass 注:所有Texture均来自冯乐乐《UnityShader入门精要》项目配套源码[^1] 代码示意 Glass.shader[^1] Shader "Glass" { Properties { _BumpMap("Normal M.

alicelise的博客 2922

UnityShader学习笔记——高级纹理

我们可以自定义一些简单的偏移计算规则,让最终的采样位置发生偏移,以模拟折射效果Properties//0表示完全不折射,即完全反射,1表示完全不反射,即透明SubShaderPassCGPROGRAM//GrabPass默认存储的纹理变量struct v2f//用于存储从屏幕图像中采样的坐标(顶点相对于屏幕的位置)//用于在主纹理中采样的uv坐标v2f data;//屏幕坐标转换相关的内容//反射相关。

2301_80342725的博客 1495

UnityShader实例04:遮挡透明材质

遮挡透明材质 边缘光材质原理和xray材质相类似,shader代码也就长得几乎一样了,一般游戏中做一些角色的背光效果,或者宝石材质(如下图所示),总之看怎么灵活运用了。

lupeng的博客 2万+

UnityShader 玻璃效果与程序纹理

玻璃效果 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' Shader "Custom/Glass" { Properties { _MainTex("MainTex", 2D) = "white" {} _TexScale("TexScale", Range(0, 1.0)) = 1 _NormalMap("Normal

awsl_tsl的博客 494

UnityShader 学习笔记 14 高级纹理之模拟玻璃的折射

Shader&nbsp;"_MyShader/7_Advanced/4_GlassRefraction" { &nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_MainTex&nbsp;("MainTex",&

略懂PS的呆毛王的博客 646

UnityShader学习——渲染纹理

文章目录渲染纹理简介渲染纹理应用1.镜子效果2.玻璃效果 渲染纹理简介 在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render TargetTexture, RTT),而不是传统的帧缓冲或后备缓冲(back buffer)。与之相关的是多重渲染目标(Multiple Render Targe...

方寸想法,编码宇宙 1008
上一篇: 近期的一些错误汇总——UnityShader学习笔记
下一篇: TriPlanar三方向平面映射——UnityShader学习笔记
ezcome11
博客等级 码龄14年 32粉丝 30原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值