UnityShader学习——渲染纹理

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

渲染纹理简介

在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render TargetTexture, RTT),而不是传统的帧缓冲或后备缓冲(back buffer)。与之相关的是多重渲染目标(Multiple Render Target, MRT),这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中,而不再需要为每个渲染目标纹理单独渲染完整的场景。延迟渲染就是使用多重渲染目标的一个应用。

Unity为渲染目标纹理定义了一种专门的纹理类型——渲染纹理(Render Texture)。

在Unity中使用渲染纹理通常有两种方式:

  1. 在Project目录下创建一个渲染纹理,然后把某个摄像机的渲染目标设置成该渲染纹理,这样一来该摄像机的渲染结果就会实时更新到渲染纹理中,而不会显示在屏幕上。使用这种方法,我们还可以选择渲染纹理的分辨率、滤波模式等纹理属性。
  2. 在屏幕后处理时使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值