(八)Grahpics之Blit

1.前言

Graphics的Blit方法是比较简单也是比较常用的方法。最简单的作用是将一张纹理绘制到另一张纹理中。而在此方法中可以指定一种材质来实现特殊的效果,所以常和OnRenderImage方法配合使用来实现屏幕后处理效果。

2.OnRenderImage简介

void OnRenderImage(RenderTexture src, RenderTexture dest)方法是unity中渲染流程的最后阶段,如果不调用此方法则渲染的图像直接显示到屏幕上(不考虑buffer问题),如果调用则src为获取到的渲染图像,dest则为绘制的目标纹理。调用此方法的脚本需要挂载在含有camera组建的脚本上。

3.应用示例

3.1 最简单应用

下述方法为将camera渲染结果直接绘制到屏幕上,不做任何处理,当然如果这样调用也就没有调用此方法的意义了。

    void OnRenderImage(RenderTexture src, RenderTexture dest)
     {		
     	Graphics.Blit(src, dest);
	}

3.2 最基本应用

一般应用如下所示,设置某一材质,然后通过材质对src纹理进行处理,并绘制到dest上,但是material要包含_MainTex变量,因为unity会默认将src纹理赋值给_MainTex。

    material.SetFloat("_Brightness", brightness);
    void OnRenderImage(RenderTexture src, RenderTexture dest)
     {		
     	Graphics.Blit(src, dest, material);
	}

3.3 完整范例

public class GaussianBlur : PostEffectsBase {

	public Shader matShader;
	private Material mat;

	public Material material {  
		get {
			if(mat==null)
			{
			mat=new Material(matShader)}
			return mat;
		}  
	}

	[Range(0, 4)]
	public int iterations = 3;
	
	void OnRenderImage (RenderTexture src, RenderTexture dest) {
		if (material != null) {
			int rtW = src.width
			int rtH = src.height

			RenderTexture buffer0 = RenderTexture.GetTemporary(rtW, rtH, 0);
			buffer0.filterMode = FilterMode.Bilinear;

			Graphics.Blit(src, buffer0);

			for (int i = 0; i < iterations; i++) {

				RenderTexture buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);

			Graphics.Blit(buffer0, buffer1, material, 0);

				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
				buffer1 = RenderTexture.GetTemporary(rtW, rtH, 0);

				// Render the horizontal pass
				Graphics.Blit(buffer0, buffer1, material, 1);

				RenderTexture.ReleaseTemporary(buffer0);
				buffer0 = buffer1;
			}

			Graphics.Blit(buffer0, dest);
			RenderTexture.ReleaseTemporary(buffer0);
		} else {
			Graphics.Blit(src, dest);
		}
	}
}

4.结语

此方法应用就是如此简单。

原文地址:https://www.cnblogs.com/llstart-new0201/p/12831508.html