当前位置:   article > 正文

Unity 快速实现镜子效果_unity镜子效果

unity镜子效果

一、快速搭建一个简单的场景

如图,白色的Quad即当作镜子。

二、使用相机纹理

创建一个相机,放到和镜子相同的位置(根据具体效果微调),再新建一个renderTexture,链接到相机的TargetTexture,并赋给镜子的材质球当纹理贴图,如下就能把摄像机拍摄到的东西显示在镜子上了。

三、实现镜面效果

我们现实中的镜子是左右反向的,所以要对现有纹理进行UV的反向处理。

为了方便修改,我们可以新建一个系统内置的Unlit Shader,在frag函数中现实UV左右对调,

i.uv.x = 1 - i.uv.x;

这样再把这个shader赋给镜子即可。

四、改变镜子形状

很多时候镜子不是方方正正的,这时候就需要使用遮罩来实现不同形状的镜子。

我用PS随便画了一个形状的遮罩图,如下。

 

遮罩图只有纯黑和纯白两种颜色,要让镜面呈现在黑色区域,就可以使用r通道相减剔除,如下

  1. fixed4 col = tex2D(_MainTex, i.uv);
  2. fixed4 maskcol = tex2D(_MaskTex, i.uv);
  3. clip(col.r-maskcol.r);

最后的效果如下

五、附镜子的Shader代码

  1. Shader "Unlit/GlassShader"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {} //镜面主纹理
  6. _MaskTex("MaskTex", 2D) = "white" {} //遮罩纹理
  7. }
  8. SubShader
  9. {
  10. Tags { "RenderType"="Opaque" }
  11. LOD 100
  12. Pass
  13. {
  14. CGPROGRAM
  15. #pragma vertex vert
  16. #pragma fragment frag
  17. #include "UnityCG.cginc"
  18. struct appdata
  19. {
  20. float4 vertex : POSITION;
  21. float2 uv : TEXCOORD0;
  22. };
  23. struct v2f
  24. {
  25. float2 uv : TEXCOORD0;
  26. UNITY_FOG_COORDS(1)
  27. float4 vertex : SV_POSITION;
  28. };
  29. sampler2D _MainTex;
  30. float4 _MainTex_ST;
  31. sampler2D _MaskTex;
  32. v2f vert (appdata v)
  33. {
  34. v2f o;
  35. o.vertex = UnityObjectToClipPos(v.vertex);
  36. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  37. return o;
  38. }
  39. fixed4 frag (v2f i) : SV_Target
  40. {
  41. i.uv.x = 1 - i.uv.x; //uv左右反向
  42. fixed4 col = tex2D(_MainTex, i.uv);
  43. fixed4 maskcol = tex2D(_MaskTex, i.uv);
  44. clip(col.r-maskcol.r); //剔除遮罩白色区域
  45. return col;
  46. }
  47. ENDCG
  48. }
  49. }
  50. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/108391
推荐阅读
相关标签
  

闽ICP备14008679号