时间:2021-05-19
本文实例为大家分享了unity实现玻璃效果的具体代码,供大家参考,具体内容如下
一、使用Cubemap,做一个假反射
shader代码如下:
Shader "Custom/glassShader" { Properties { _MainColor("Main Color",Color)=(1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _Cube("Cube",CUBE)=""{} } SubShader { Tags {"RenderType"="Opaque"} LOD 200 //cull off CGPROGRAM #pragma surface surf Lambert alpha fixed4 _MainColor; sampler2D _MainTex; samplerCUBE _Cube; struct Input { float2 uv_MainTex; float3 worldRefl; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb*_MainColor.rgb; o.Emission=texCUBE(_Cube,IN.worldRefl).rgb; o.Alpha = c.a*_MainColor.a; } ENDCG } FallBack "Diffuse"}二、使用GrabPass,抓取屏幕纹理,实现实时反射
shader代码如下:
Shader "Unlit/GrabGlass"{ Properties { _Color("Main Color",Color)=(1,1,1,1) _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "RenderType"="Opaque" }//Opaque LOD 100 //绘制半透明物体 关闭深度缓存 ZWrite Off //透明混合 Blend SrcAlpha OneMinusSrcAlpha //如果没有命名,则可以用_GrabTexture来读取,不过开销很大,应用到特殊效果时才去应用 GrabPass { "_GrabTex" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Color; sampler2D _GrabTex; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv)*_Color; // apply fog UNITY_APPLY_FOG(i.fogCoord, col); //调整一下uv float2 uv=i.uv; uv.x=1-uv.x; return col*tex2D(_GrabTex,uv); } ENDCG } }}效果如下:
三、使用摄像机实现实时反射
因为GrabPass,相对来说消耗较大,只建议用于一些特殊效果,于是这里就借助辅助摄像机,来实现实时反射效果,当然这需要多写一个脚本,同时需要在辅助摄像机中屏蔽玻璃本身
shader代码如下:
Shader "Unlit/CameraGlass"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture 需要调整一下uv fixed4 col = tex2D(_MainTex, 1-i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } }}脚本代码如下:
using UnityEngine;using System.Collections;public class RenderGlassTexture : MonoBehaviour { /// <summary> /// 辅助摄像机 /// 原理:就是将辅助摄像机所看到的内容渲染到玻璃物体上,所以就实现了实时反射的镜面效果 /// 因为玻璃也是场景中的物体,所以辅助摄像机也会看见他 /// 所以最好能将玻璃物体单独放在一个层级中,让辅助摄像机不去渲染他 /// </summary> public Camera cam; private RenderTexture renderTex; /// <summary> /// 玻璃shader /// </summary> public Shader glassShader; /// <summary> /// 玻璃材质 /// </summary> private Material m_GlassMaterial; protected Material GlassMaterial { get { if (m_GlassMaterial == null) { m_GlassMaterial = new Material(glassShader); } return m_GlassMaterial; } } // Use this for initialization void Start () { renderTex = new RenderTexture(Screen.width, Screen.height, 16); cam.targetTexture = renderTex; } //在摄像机开始裁剪场景之前调用 void OnPreCull() { GlassMaterial.SetTexture("_MainTex", renderTex); } //在相机完成场景渲染后调用 void OnPostRender() { GlassMaterial.SetTexture("_MainTex", null); }}效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Unity3D中shader轮廓描边效果想利用Unity3D中shader这个功能实现描边轮廓边框效果该怎么做呢,相信有很多搞开发的人想知道,为此下面就给大家介
Unity3d描边框效果网上有很多,大多是使用Shader来实现的本文介绍使用Collider来实现这么一种效果效果图如下将物体添加Collider(BoxCo
本文实例为大家分享了Unity实现弧形移动效果的具体代码,供大家参考,具体内容如下一、实现效果二、第一种实现方法——弧形插值usingUnityEngine;p
本文实例为大家分享了unity实现文字滚动效果的具体代码,供大家参考,具体内容如下效果:代码:usingSystem.Collections;usingSyst
基于unity3D实现渐变颜色的简单脚本,代码很少,就不废话了,直接上代码和效果图。效果图:usingSystem;usingSystem.Collection