【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

 笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题。

根据官方的定义,我们可知,渲染纹理是一种可以实时更新的特殊纹理,同时我们也可以将它像普通纹理一样应用于一个材质中。那么我们如何创建一个渲染纹理呢?通常我们会使用以下两种方法来创建一个渲染纹理:

  • 在 Project 下右键创建
     
  •  
     
  • 利用 GrabPass 或者 OnRenderImage 来获取当前屏幕图像(OnRenderImage 函数是我们实现屏幕特效的核心方法之一,所以我不打算在此处进行介绍)

通过以上的方法我们就可以创建出一个渲染纹理了,那么我们来利用它实现一些效果。

 

 

二. Mirror

先来看看我们要实现的效果

 

可以看到场景中有一面区域可以镜像映射场景中的事物图像,这就是我们要实现的类似镜子的效果。那么现在我们开始实现它。

 

2.1 准备工作

(1)创建一个场景,其中为了观察效果,我使用了前文实现的立方体纹理来作为天空盒。

(2)创建 2 个 Cube,2 个 Sphere,分别赋予不同的颜色用于区别。当然你可以放上你喜欢的模型。

(3)创建一个 Quad ,将 Quad 的位置放在步骤创建的 Cube 和 Sphere 前面,面向 Cube 和 Sphere 。

(4)创建一个 Material 和 一个 RenderTexture ,命名为 Mirror 。将 RenderTexture 赋予材质,将材质赋予 Quad 。

    

(5)创建一个摄像机,调整位置,视野,使其相当于 Quad 望向于 Cube 和 Spere,将 RenderTexture 赋予摄像机的 Target Texture。

    

(6)先观察一下效果。

        

        可以看到 Quad 的确有点像一面镜子一样,但有一点十分诡异。没错,那就是物体位置在 X 轴上相反了

        前面说过,我们调整摄像机,让其相当于望向物体,那么它的视野应该是这样的

  

  

 

        如果不做什么修改,直接把 RenderTexture 赋予 Quad,那么 Quad 上的图像就是这样的,很显然不符合我们的思维习惯

   

(7)因为镜子是镜像的,所以我们要解决步骤 6 中出现的问题,创建一个 shader 命名为 Mirror,实现以下的效果。

    

       

2.2 实现 shader

要解决上述问题其实在思路上是比较简单的,只需要进行 X 轴(水平方向上的翻转)就可以了,只是涉及了 UV 和纹理采样的操作,且不用计算光照等,所以这个 shader 是比较简单的。

 

I. 定义 Properties 块

我们在 Properties 中只需要一个纹理属性,对应着前面创建的 RenderTexture 。

 

II. 定义输入输出结构体

 

 

III.接下来就是在顶点着色器中翻转 UV 的 x 分量,然后在片元着色器中利用翻转过后的 UV 来对 RenderTexture 采样

 

 

完整代码:

复制代码
 1 Shader "Unity/RenderTexture/Mirror" {  2     Properties {  3  4         _MainTex ("Albedo (RGB)", 2D) = "white" {}  5 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信