CommandBuffer学习之RenderTexture"/>
CommandBuffer学习之RenderTexture
CommandBuffer学习之RenderTexture
一. 什么是RenderTexture
-
Unity中的一个特殊的纹理类型,访问接口继承Texture.
- Texture对象由访问者不同分为两种:
-
一种是Server-side创建在显存,由GPU访问.
-
另外一种是Client-side创建在内存,由CPU访问.
-
当CPU提交渲染请求时,会把内存中的纹理对象复制到GPU可访问的显存中.
-
当然如果有需求,也可以把GPU显存中的纹理复制到CPU可访问的内存中.
-
-
RenderTexture是GPU上的Server-side的Texture对象,它直接关联GPU显存中叫做FBO(Frame Buffer Object)的内存块.
-
FBO是所有GPU绘制渲染的目的地.
-
GPU可以创建多个FBO,其中有一个默认的FBO是直接关联显示设备的,就是把我们绘制的内容显示到显示设备上的.
-
因为是Server-side的Texture,所以RenderTexture可以被GPU渲染时直接使用,在CPU提交渲染请求时不需要进行复制处理.
二. RenderTexture用处
-
屏幕图像后处理:就是在场景中所有物体都被渲染完成后,在输出的RenderTexture上进行各种图像处理,比如:模糊,扭曲,去色,颜色校正等等,这些图像处理算法可以参照Photoshop的后处理效果.
-
阴影处理:使用另外一个摄像机把当前场景中的物体的深度渲染到一张RenderTexture中,然后在主相机渲染物体时,判断是否由深度遮挡,进而判断是否产生阴影.
-
延迟渲染:把多个光照要素,模型要素等分别渲染到不同的RenderTexture上,到最后集合所有要素把模型的整体效果绘制到最终显示设备.
-
上面只是几个常用的,现在几乎所有的实时渲染高级效果,都会用到RenderTexture.它的身影无所不再.
三. RenderTexture的创建方式:
- 使用RenderTexture的构造函数
-
这个方法创建的RenderTexture,需要自己管理,包括创建和释放,是否有效等等.
-
示例:
//1. 直接通过调用构造函数来创建一个RenderTexture var RT = new RenderTexture(1024, 1024, 16, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); //2. 释放RenderTexture RT.Release(); GameObject.Destroy(RT); RT = null;
-
- 使用RenderTexture的GetTemporary静态函数
-
这个方法是请求Unity的RenderTexture缓存系统来获取一个符合条件的RenderTexture.
-
这个方法申请的RenderTexture,创建和释放是由Unity缓存系统处理,我们只是获得了使用权。
-
示例:
//调用静态函数GetTemporary来从缓存系统中申请一个RenderTexture的使用权 RT = RenderTexture.GetTemporary(1024, 1024, 16, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); //把RenderTexture的使用权,交还给Unity的缓存系统。 RenderTexture.ReleaseTemporary(RT); RT = null;
-
- 使用CommandBuffer的GetTemporary静态函数
-
这个方法的本质与(2)的方法一致。都是从Unity的缓存系统中获得一个RenderTextur
-
更多推荐
CommandBuffer学习之RenderTexture
发布评论