700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Shader实现透明反射效果应用地板

Shader实现透明反射效果应用地板

时间:2022-11-29 04:28:27

相关推荐

Shader实现透明反射效果应用地板

实现瓷砖效果:

瓷砖一般会有反光效果,Bump 凹凸,Spec:高光,下面是展现瓷砖效果的Shader:

Shader "Mirrors/Bumped Specular" {Properties {_Color ("Main Color", Color) = (1,1,1,1)_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}_BlendLevel("Main Material Blend Level",Range(0,1))=1_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)_Shininess ("Shininess", Range (0.03, 1)) = 0.078125_BumpMap ("Normalmap", 2D) = "bump" {}_Bumpness ("Bump Rate",Range(0,1))= 0.5_Ref ("For Mirror reflection,don't set it!", 2D) = "white" {}_RefColor("Reflection Color",Color) = (1,1,1,1)_RefRate ("Reflective Rate", Range (0, 1)) = 1_Distortion ("Reflective Distortion", Range (0, 1)) = 0}SubShader { Tags { "RenderType"="Opaque" }LOD 400CGPROGRAM#pragma surface surf BlinnPhong#pragma target 3.0#pragma debugsampler2D _MainTex;sampler2D _BumpMap;fixed4 _Color;half _Shininess;half _RefRate;half _Bumpness;half _BlendLevel;half _Distortion;fixed4 _RefColor;sampler2D _Ref;struct Input {float2 uv_MainTex;float2 uv_BumpMap;float2 uv_Ref ;float4 screenPos;};void surf (Input IN, inout SurfaceOutput o) {fixed3 nor = UnpackNormal (tex2D(_BumpMap, IN.uv_BumpMap));fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);float2 screenUV = IN.screenPos.xy / IN.screenPos.w;screenUV += nor.xy * _Distortion;fixed4 ref = tex2D(_Ref, screenUV);o.Albedo = tex.rgb * _Color.rgb * _BlendLevel;o.Emission = ref.rgb * _RefColor.rgb * _RefRate;o.Normal = nor.rgb * _Bumpness;o.Gloss = tex.a;o.Alpha = tex.a * _Color.a;o.Specular = _Shininess;}ENDCG}FallBack "Specular"}

材质球上Shader参数设置如下:

反射效果:

地板上添加上脚本Mirror来调节清晰度:

using UnityEngine;using System.Collections;[ExecuteInEditMode] public class Mirror : MonoBehaviour{public bool m_DisablePixelLights = true;public int m_TextureSize = 256;public float m_ClipPlaneOffset = 0.07f;public bool m_IsFlatMirror = true;public LayerMask m_ReflectLayers = -1;private Hashtable m_ReflectionCameras = new Hashtable(); private RenderTexture m_ReflectionTexture = null;private int m_OldReflectionTextureSize = 0;private static bool s_InsideRendering = false;public void OnWillRenderObject(){if( !enabled || !GetComponent<Renderer>() || !GetComponent<Renderer>().sharedMaterial || !GetComponent<Renderer>().enabled )return;Camera cam = Camera.current;if( !cam )return;if( s_InsideRendering )return;s_InsideRendering = true;Camera reflectionCamera;CreateMirrorObjects( cam, out reflectionCamera );Vector3 pos = transform.position;Vector3 normal;if(m_IsFlatMirror){normal = transform.up;}else{ normal= transform.position - cam.transform.position ;normal.Normalize();}int oldPixelLightCount = QualitySettings.pixelLightCount;if( m_DisablePixelLights )QualitySettings.pixelLightCount = 0;UpdateCameraModes( cam, reflectionCamera );float d = -Vector3.Dot (normal, pos) - m_ClipPlaneOffset;Vector4 reflectionPlane = new Vector4 (normal.x, normal.y, normal.z, d);Matrix4x4 reflection = Matrix4x4.zero;CalculateReflectionMatrix (ref reflection, reflectionPlane);Vector3 oldpos = cam.transform.position;Vector3 newpos = reflection.MultiplyPoint( oldpos );reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection;Vector4 clipPlane = CameraSpacePlane( reflectionCamera, pos, normal, 1.0f );Matrix4x4 projection = cam.projectionMatrix;CalculateObliqueMatrix (ref projection, clipPlane);reflectionCamera.projectionMatrix = projection;reflectionCamera.cullingMask = ~(1<<4) & m_ReflectLayers.value; reflectionCamera.targetTexture = m_ReflectionTexture;GL.SetRevertBackfacing (true);reflectionCamera.transform.position = newpos;Vector3 euler = cam.transform.eulerAngles;reflectionCamera.transform.eulerAngles = new Vector3(0, euler.y, euler.z);reflectionCamera.Render();reflectionCamera.transform.position = oldpos;GL.SetRevertBackfacing (false);Material[] materials = GetComponent<Renderer>().sharedMaterials;foreach( Material mat in materials ) {if( mat.HasProperty("_Ref") )mat.SetTexture( "_Ref", m_ReflectionTexture );}if( m_DisablePixelLights )QualitySettings.pixelLightCount = oldPixelLightCount;s_InsideRendering = false;}void OnDisable(){if( m_ReflectionTexture ) {DestroyImmediate( m_ReflectionTexture );m_ReflectionTexture = null;}foreach( DictionaryEntry kvp in m_ReflectionCameras )DestroyImmediate( ((Camera)kvp.Value).gameObject );m_ReflectionCameras.Clear();}private void UpdateCameraModes( Camera src, Camera dest ){if( dest == null )return;dest.clearFlags = src.clearFlags;dest.backgroundColor = src.backgroundColor; if( src.clearFlags == CameraClearFlags.Skybox ){Skybox sky = src.GetComponent(typeof(Skybox)) as Skybox;Skybox mysky = dest.GetComponent(typeof(Skybox)) as Skybox;if( !sky || !sky.material ){mysky.enabled = false;}else{mysky.enabled = true;mysky.material = sky.material;}}dest.farClipPlane = src.farClipPlane;dest.nearClipPlane = src.nearClipPlane;dest.orthographic = src.orthographic;dest.fieldOfView = src.fieldOfView;dest.aspect = src.aspect;dest.orthographicSize = src.orthographicSize;dest.renderingPath = src.renderingPath;}private void CreateMirrorObjects( Camera currentCamera, out Camera reflectionCamera ){reflectionCamera = null;if( !m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize ){if( m_ReflectionTexture )DestroyImmediate( m_ReflectionTexture );m_ReflectionTexture = new RenderTexture( m_TextureSize, m_TextureSize, 16 );m_ReflectionTexture.name = "__MirrorReflection" + GetInstanceID();m_ReflectionTexture.isPowerOfTwo = true;m_ReflectionTexture.hideFlags = HideFlags.DontSave;m_OldReflectionTextureSize = m_TextureSize;}reflectionCamera = m_ReflectionCameras[currentCamera] as Camera;if( !reflectionCamera ) {GameObject go = new GameObject( "Mirror Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera), typeof(Skybox) );reflectionCamera = go.GetComponent<Camera>();reflectionCamera.enabled = false;reflectionCamera.transform.position = transform.position;reflectionCamera.transform.rotation = transform.rotation;reflectionCamera.gameObject.AddComponent<FlareLayer>();go.hideFlags = HideFlags.HideAndDontSave;m_ReflectionCameras[currentCamera] = reflectionCamera;} }private static float sgn(float a){if (a > 0.0f) return 1.0f;if (a < 0.0f) return -1.0f;return 0.0f;}private Vector4 CameraSpacePlane (Camera cam, Vector3 pos, Vector3 normal, float sideSign){Vector3 offsetPos = pos + normal * m_ClipPlaneOffset;Matrix4x4 m = cam.worldToCameraMatrix;Vector3 cpos = m.MultiplyPoint( offsetPos );Vector3 cnormal = m.MultiplyVector( normal ).normalized * sideSign;return new Vector4( cnormal.x, cnormal.y, cnormal.z, -Vector3.Dot(cpos,cnormal) );}private static void CalculateObliqueMatrix (ref Matrix4x4 projection, Vector4 clipPlane){Vector4 q = projection.inverse * new Vector4(sgn(clipPlane.x),sgn(clipPlane.y),1.0f,1.0f);Vector4 c = clipPlane * (2.0F / (Vector4.Dot (clipPlane, q)));projection[2] = c.x - projection[3];projection[6] = c.y - projection[7];projection[10] = c.z - projection[11];projection[14] = c.w - projection[15];}private static void CalculateReflectionMatrix (ref Matrix4x4 reflectionMat, Vector4 plane){reflectionMat.m00 = (1F - 2F*plane[0]*plane[0]);reflectionMat.m01 = ( - 2F*plane[0]*plane[1]);reflectionMat.m02 = ( - 2F*plane[0]*plane[2]);reflectionMat.m03 = ( - 2F*plane[3]*plane[0]);reflectionMat.m10 = ( - 2F*plane[1]*plane[0]);reflectionMat.m11 = (1F - 2F*plane[1]*plane[1]);reflectionMat.m12 = ( - 2F*plane[1]*plane[2]);reflectionMat.m13 = ( - 2F*plane[3]*plane[1]);reflectionMat.m20 = ( - 2F*plane[2]*plane[0]);reflectionMat.m21 = ( - 2F*plane[2]*plane[1]);reflectionMat.m22 = (1F - 2F*plane[2]*plane[2]);reflectionMat.m23 = ( - 2F*plane[3]*plane[2]);reflectionMat.m30 = 0F;reflectionMat.m31 = 0F;reflectionMat.m32 = 0F;reflectionMat.m33 = 1F;}}

下面简单介绍下Unity快捷方式创建贴图

上面图片复制一份,选中改变贴图类型为法线贴图如下所示 点击 Apply应用一下:

法线贴图主要表现一些凹凸效果,法线贴图一般会让美工通过手绘板画效果会更好一些也会省性能,毕竟渲染会牵扯到计算

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。