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应用一下:
法线贴图主要表现一些凹凸效果,法线贴图一般会让美工通过手绘板画效果会更好一些也会省性能,毕竟渲染会牵扯到计算
Shader实现透明反射效果应用地板相关推荐
- Unity Shader 实现透明护盾效果
这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...
- shader 反射 水面_【博物纳新】水面涟漪反射效果开源库测评
[博物纳新]是UWA重磅推出的全新栏目,旨在为开发者推荐新颖.易用.有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目.前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性.很多时 ...
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
- JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
本文实例讲述了js+CSS实现弹出一个全屏灰黑色透明遮罩效果的方法.分享给大家供大家参考.具体分析如下: 在众多的网站都有这样的效果,当进行一定的操作之后,会弹出一个灰黑色的半透明的遮罩,在上面可以操 ...
- Android完美实现kitkat透明导航效果
完美实现Android4.4的透明状态栏效果 不多说 代码奉上:(注意要使用noActionbar) public class MainActivity extends AppCompatActivi ...
- Visual C++游戏编程基础之透明半透明效果
一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图 和背景图彼此对应的像素颜色按某一比例进行调配, ...
- Unity Shader学习-高光反射
Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...
- CorelDRAW Transparency(透明)效果(转)
CorelDRAW Transparency(透明)效果(转)[@more@] Transparency(透明)效果是通过改变对象填充颜色的透明成度 , 来创建独特的视觉效果.使用 Interacti ...
- CSS实现Div层背景半透明而内容不透明的效果
CSS实现Div层背景半透明而内容不透明的效果 2014年5月18日 MK 前端设计 0 阅读 2932次 前几天有一个学弟问我,怎么样能实现Div层背景半透明而内容不透明的效果呢,他写的效果不管怎么 ...
- CSS中如何制作背景图片半透明但内容不透明的效果
CSS中如何制作背景半透明但内容不透明的效果 一.利用伪元素:before添加一个半透明的背景,并利用position定位属性,设置z-index值为-1,显示在下层. css: <style& ...
最新文章
- CVPR 2021 更好的Backbone,伯克利谷歌提出BoTNet,精度达84.7%
- 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
- PyQt5 Python主对话框创建关于对话框源代码
- matlab矩阵信号,matlab - 如何在Matlab中使用移位版本的信号样本创建矩阵? - SO中文参考 - www.soinside.com...
- Pytest之自定义mark
- 勒索病毒记录:将电脑 后缀改为.nedjprf
- c店店铺名怎么用旗舰店_大发现!三利和洁丽雅2大国民毛巾品牌也有1688店铺!...
- html刘海屏高度,iphone刘海屏网页适配方法
- javaweb使用 window.location.href 传中文参数 乱码问题
- 实战 TPCC-MySQL 基准测试
- 基于单片机的无线鼠标设计
- Maven ojdbc错误:Cannot resolve com.oracle:ojdbc6:11.2.0.1.0
- 残差灰色模型matlab,数学建模+灰色预测模型+MATLAB详解.doc
- 搭建本地私有pip源
- Cesium中的几种坐标和相互转换
- 区块链平台架构设计的知识图谱
- dplyr-高效的数据变换与整理工具--转载
- mini2440中nand falsh的使用
- js利用tab键切换当前页面_JavaScript跳转到指定页面并且到指定的tab切换窗口
- TextView设置MaxLength