大家好,又见面了,我是你们的朋友全栈君。
1.前言
Graphics的Blit方法是比较简单也是比较常用的方法。最简单的作用是将一张纹理绘制到另一张纹理中。而在此方法中可以指定一种材质来实现特殊的效果,所以常和OnRenderImage方法配合使用来实现屏幕后处理效果。
2.OnRenderImage简介
void OnRenderImage(RenderTexture src, RenderTexture dest)方法是unity中渲染流程的最后阶段,如果不调用此方法则渲染的图像直接显示到屏幕上(不考虑buffer问题),如果调用则src为获取到的渲染图像,dest则为绘制的目标纹理。调用此方法的脚本需要挂载在含有camera组建的脚本上。
3.应用示例
3.1 最简单应用
下述方法为将camera渲染结果直接绘制到屏幕上,不做任何处理,当然如果这样调用也就没有调用此方法的意义了。
代码语言:javascript复制 void OnRenderImage(RenderTexture src, RenderTexture dest) { Graphics.Blit(src, dest); }
3.2 最基本应用
一般应用如下所示,设置某一材质,然后通过材质对src纹理进行处理,并绘制到dest上,但是material要包含_MainTex变量,因为unity会默认将src纹理赋值给_MainTex。
代码语言:javascript复制 material.SetFloat("_Brightness", brightness); void OnRenderImage(RenderTexture src, RenderTexture dest) { Graphics.Blit(src, dest, material); }
3.3 完整范例
代码语言:javascript复制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://javaforall.cn/167224.html原文链接:https://javaforall.cn