当前位置: 首页 > article >正文

Unity 后期特效用到的一些方法:OnRenderImage Blit

1.OnRenderImage (RenderTexture source, RenderTexture destination)

当这个函数被调用时,所有的渲染已经完成,渲染结果以参数source传入到函数中。它允许你对最终的显示图像进行处理。所以说是后期特效。

处理的最终结果会输入到destination中。如果相机上添加多个后处理脚本则会依次执行,而且前一个的destination会用作下一个的source。

2.Graphics.Blit

public static void Blit(Texture sourceRenderTexture destMaterial mat, int pass = -1);

有三个重载方法,这个方法的参数是最全的。

如果mat不为空,那么source被设置为mat中的shader的_MainTex,因此必须在shader开头的Properties块中定义_MainTex属性.

该方法使用mat中的shader绘制一个全屏的quad

Note that if you want to use depth or stencil buffer that is part of the source (Render)texture, you'll have to do equivalent of Blit functionality manually - i.e.Graphics.SetRenderTarget with destination color buffer and source depth buffer, setup orthographic projection (GL.LoadOrtho), setup material pass (Material.SetPass) and draw a quad (GL.Begin).

由上面这段话可以看出:Blit的等价方法是依次使用Graphics.SetRenderTargetGL.LoadOrthoMaterial.SetPass和

GL.Begin(GL.QUADS);(GL.QUADS);

所以说,最后实际渲染的是一个以mat为材质,以source为_MainTex的全屏大小的quad,渲染该quad的摄像机为正交的。渲染的结果输出到destination,destination就是rendertarget.

网上某人写的,大致应该就是这样吧,没研究

 static public void Blit(RenderBuffer COLOR,RenderBuffer DEPTH, Material MRTMat,int pass)
        {
                Graphics.SetRenderTarget(COLOR, DEPTH);
                RenderQuad (MRTMat, pass);
        }

static public void RenderQuad( Material MRTMat,int pass)
        {

                GL.PushMatrix();
                GL.LoadOrtho();
                MRTMat.SetPass(pass);
                GL.Begin(GL.QUADS);
                GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 0.1f);//设置顶点,这样可以全屏,(0,1)代表屏幕左上角
                GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(1.0f, 1.0f, 0.1f);  //右上角              
                GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(1.0f, 0.0f, 0.1f);  //右下角              
                GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(0.0f, 0.0f, 0.1f);  //左下角              
                GL.End();
                GL.PopMatrix();
}

这个函数就像过转化器一样,source图片经过它的处理变成了dest图片,其中材质对象mat负责算法实施(更准确的说法:算法是绑定到该mat上的shader来实现的。shader可以有多个pass,可以通过pass参数指定特定的shader,-1表示执行这个shader上所有的pass)

3.

Texture size

{TextureName}_TexelSize - a float4 property contains texture size information:

  • x contains 1.0/width
  • y contains 1.0/height
  • z contains width
  • w contains height


http://www.kler.cn/a/147460.html

相关文章:

  • Word_小问题解决_1
  • eBPF on Go
  • 小白进!QMK 键盘新手入门指南
  • 速盾:cdn 支持 php 吗?
  • Javascript_设计模式(二)
  • Node.js GET/POST请求、WEB模块使用介绍 (基础介绍 八)
  • illuminate/database 使用 四
  • 第71讲:MySQL锁机制详解:表级锁、元数据锁和意向锁的全面解析与实践指南
  • python实现自动刷平台学时
  • Vue 2.0源码分析-渲染函数render
  • 【密码学引论】分组密码
  • css之选择第一个或最后一个元素、第n个标签、选择偶数或奇数标签、选择最后n个标签、等差数列标签的选择、first、last、nth、child
  • 学习Qt的网站
  • git突然失效:无法提交的问题 无法推送到远程仓库
  • 为什么API管理工具对开发人员有益?
  • Vue中的深度监听Deep Watch
  • 第十七章 处理空字符串和 Null 值 - XMLIGNORENULL、XMLNIL 和 XMLUSEMPTYELEMENT 的详细信息
  • Node.js下载安装及配置镜像源
  • element plus中表格的合计属性和例子
  • 0001Java程序设计-springboot基于微信小程序批发零售业商品管理系统
  • Git的原理与使用(一):Git的基本操作(包含:版本回退)
  • 深度学习18
  • 【数据结构】树与二叉树(廿二):树和森林的遍历——后根遍历(递归算法PostOrder、非递归算法NPO)
  • [ CSS ] 内容超出容器后 以...省略
  • SpringCloud-高级篇(五)
  • 【开发实践】网页预览excel表格原版样式