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.結語
此方法應用就是如此簡單。