• (八)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.结语

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

  • 相关阅读:
    初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
    【树形dp】7.14城市
    【树形背包】bzoj4033: [HAOI2015]树上染色
    【计数】51nod1677 treecnt
    【树链剖分 差分】bzoj3626: [LNOI2014]LCA
    【最短路径树】51nod1443 路径和树
    python--异常处理
    常用模块之hashlib,configparser,logging模块
    面向对象之反射及内置方法
    python之封装
  • 原文地址:https://www.cnblogs.com/llstart-new0201/p/12831508.html
Copyright © 2020-2023  润新知