渲染纹理
渲染目标纹理(RTT):把整个三维场景渲染到一个中间缓冲中,而不是传统的帧缓冲
多重渲染目标(MRT):把场景同时渲染到多个渲染目标纹理中,不需要为每个渲染目标纹理单独渲染完整的场景,比如延迟渲染
在Unity中定义为渲染纹理(Render Texture),有两种实现方式:一种是在Project目录下创建一个渲染纹理,然后把某个摄像机的渲染目标设置为该纹理;另一种是在屏幕后处理时使用GrabPass命令或OnRenderImage函数来获得当前屏幕图像,放在一张等大的纹理中。
镜子效果
新建一个小房间的场景,里面放置一些球形和立方体,并且放一个四边形作为镜子。
放置一个新的摄像机,并把它的渲染目标设置为新建的渲染纹理Mirror Texture。编辑应用于镜子材质的shader,只需要处理一个纹理属性,并且在顶点着色器中翻转纹理x坐标,并在片元着色器中输出:
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
// Mirror needs to filp x
o.uv.x = 1 - o.uv.x;
return o;
}
fixed4 frag(v2f i) : SV_Target {
return tex2D(_MainTex, i.uv);
}
把前面的渲染纹理应用于这个shader,效果如下:
玻璃效果
这部分使用GrabPass的方法。
声明玻璃的纹理、法线纹理,_Cubemap模拟的是反射的环境,_Distortion控制折射的扭曲程度,_RefractAmount控制反射程度。
Properties {
_MainTex ("Main Tex", 2D) = "white" {
}
_BumpMap ("Normal Map", 2D) = "bump"