渲染纹理简介
在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render TargetTexture, RTT),而不是传统的帧缓冲或后备缓冲(back buffer)。与之相关的是多重渲染目标(Multiple Render Target, MRT),这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中,而不再需要为每个渲染目标纹理单独渲染完整的场景。延迟渲染就是使用多重渲染目标的一个应用。
Unity为渲染目标纹理定义了一种专门的纹理类型——渲染纹理(Render Texture)。
在Unity中使用渲染纹理通常有两种方式:
- 在Project目录下创建一个渲染纹理,然后把某个摄像机的渲染目标设置成该渲染纹理,这样一来该摄像机的渲染结果就会
实时更新到渲染纹理中,而不会显示在屏幕上。使用这种方法,我们还可以选择渲染纹理的分辨率、滤波模式等纹理属性。 - 在屏幕后处理时使用
GrabPass命令或OnRenderImage函数来获取当前屏幕图像,Unity会把这个屏幕图像放到一张和屏幕分辨率等同的渲染纹理中,下面我们可以在自定义的Pass中把它们当成普通的纹理来处理,从而实现各种屏幕特效。
渲染纹理vs. GrabPass:
- 简便性:GrabPass的好处在于实现简单,我们只需要在Shader中写几行代码就可以实现抓取屏幕的目的。而要使用渲染纹理的话,我们首先需要创建一个渲染纹理和一个额外的摄像机,再把该摄像机的Render Target设置为新建的渲染纹理对象,最后把该渲染纹理传递给相应的Shader。
- 效率:使用渲染纹理的效率往往要好于GrabPass,尤其在移动设备上。使用渲染纹理我们可以自定义渲染纹理的大小,尽管这种方法需要把部分场景再次渲染一遍,但我们可以通过调整摄像机的渲染层来减少二次渲染时的场景大小,或使用其他方法来控制摄像机是否需要开启。而使用GrabPass获取到的图像分辨率和显示屏幕是一致的,这意味着在一些高分辨率的设备上可能会造成严重的带宽影响。而且在移动设备上,GrabPass虽然不会重新渲染场景,但它往往需要CPU直接读取后备缓冲
渲染纹理应用
1.镜子效果
镜子实现的原理很简单,它使用一个渲染纹理作为输入属性,并把该渲染纹理在水平方向上翻转后直接显示到物体上即可。
Shader关键代码:
Shader "ShaderBook/Chapter10/Mirror" {
Properties {
//摄像机对应的 Render Texture
_MainTex ("Main Tex", 2D) = "white" {
}
}
SubShader {
Tags {
"RenderType"="Opaque" "Queue"="Geometry"}
Pass {
CGPROGRAM
......
sampler2D _MainTex;
......
v2f vert(a2v v) {
......
o.uv = v

本文介绍了Unity中的渲染纹理(Render Texture),包括其简介、与GrabPass的区别,以及在镜子和玻璃效果中的应用。渲染纹理允许将场景渲染到中间缓冲,提高效率并支持自定义分辨率。在镜子效果中,通过水平翻转渲染纹理实现;玻璃效果则利用GrabPass处理屏幕图像,模拟折射和法线贴图。文章提供了Shader关键代码示例。
最低0.47元/天 解锁文章
1240

被折叠的 条评论
为什么被折叠?



