实现瓷砖效果:

瓷砖一般会有反光效果,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实现透明反射效果应用地板相关推荐

  1. Unity Shader 实现透明护盾效果

    这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...

  2. shader 反射 水面_【博物纳新】水面涟漪反射效果开源库测评

    [博物纳新]是UWA重磅推出的全新栏目,旨在为开发者推荐新颖.易用.有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目.前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性.很多时 ...

  3. Android UI体验之全屏沉浸式透明状态栏效果

    前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...

  4. JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法

    本文实例讲述了js+CSS实现弹出一个全屏灰黑色透明遮罩效果的方法.分享给大家供大家参考.具体分析如下: 在众多的网站都有这样的效果,当进行一定的操作之后,会弹出一个灰黑色的半透明的遮罩,在上面可以操 ...

  5. Android完美实现kitkat透明导航效果

    完美实现Android4.4的透明状态栏效果 不多说 代码奉上:(注意要使用noActionbar) public class MainActivity extends AppCompatActivi ...

  6. Visual C++游戏编程基础之透明半透明效果

    一.基本思路 1.半透明的原理 一张位图由许多像素组成,而每一像素包含R.G.B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图    和背景图彼此对应的像素颜色按某一比例进行调配, ...

  7. Unity Shader学习-高光反射

    Unity Shader学习-高光反射 高光反射计算公式 高光反射 = 光源的色彩和强度 * 材质的高光反射系数 * pow(max(0,视角方向 · 反射方向),_Gloss) 视角方向 = ref ...

  8. CorelDRAW Transparency(透明)效果(转)

    CorelDRAW Transparency(透明)效果(转)[@more@] Transparency(透明)效果是通过改变对象填充颜色的透明成度 , 来创建独特的视觉效果.使用 Interacti ...

  9. CSS实现Div层背景半透明而内容不透明的效果

    CSS实现Div层背景半透明而内容不透明的效果 2014年5月18日 MK 前端设计 0 阅读 2932次 前几天有一个学弟问我,怎么样能实现Div层背景半透明而内容不透明的效果呢,他写的效果不管怎么 ...

  10. CSS中如何制作背景图片半透明但内容不透明的效果

    CSS中如何制作背景半透明但内容不透明的效果 一.利用伪元素:before添加一个半透明的背景,并利用position定位属性,设置z-index值为-1,显示在下层. css: <style& ...

最新文章

  1. CVPR 2021 更好的Backbone,伯克利谷歌提出BoTNet,精度达84.7%
  2. 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
  3. PyQt5 Python主对话框创建关于对话框源代码
  4. matlab矩阵信号,matlab - 如何在Matlab中使用移位版本的信号样本创建矩阵? - SO中文参考 - www.soinside.com...
  5. Pytest之自定义mark
  6. 勒索病毒记录:将电脑 后缀改为.nedjprf
  7. c店店铺名怎么用旗舰店_大发现!三利和洁丽雅2大国民毛巾品牌也有1688店铺!...
  8. html刘海屏高度,iphone刘海屏网页适配方法
  9. javaweb使用 window.location.href 传中文参数 乱码问题
  10. 实战 TPCC-MySQL 基准测试
  11. 基于单片机的无线鼠标设计
  12. Maven ojdbc错误:Cannot resolve com.oracle:ojdbc6:11.2.0.1.0
  13. 残差灰色模型matlab,数学建模+灰色预测模型+MATLAB详解.doc
  14. 搭建本地私有pip源
  15. Cesium中的几种坐标和相互转换
  16. 区块链平台架构设计的知识图谱
  17. dplyr-高效的数据变换与整理工具--转载
  18. mini2440中nand falsh的使用
  19. js利用tab键切换当前页面_JavaScript跳转到指定页面并且到指定的tab切换窗口
  20. TextView设置MaxLength

热门文章

  1. Photoshop图层模式中英文对照及解释
  2. linux之间文件拷贝文件,不同的Linux之间拷贝文件
  3. java毕业设计时装购物系统mybatis+源码+调试部署+系统+数据库+lw
  4. php计算面积,PHP中长方形的面积怎么求
  5. Java jks转换pem,PEM证书转JKS
  6. 袁腾飞讲述西方古代哲学思想
  7. 常用的PHP加密方式
  8. PHP加密扩展库Mcrypt
  9. 第一章.计算机组成与体系结构
  10. photoshop另存为dds文件时的错误