Version: 2020.2
public static void Blit (Texture source, RenderTexture dest);
public static void Blit (Texture source, RenderTexture dest, Material mat, int pass= -1);
public static void Blit (Texture source, Material mat, int pass= -1);
public static void Blit (Texture source, RenderTexture dest, Vector2 scale, Vector2 offset);
public static void Blit (Texture source, RenderTexture dest, int sourceDepthSlice, int destDepthSlice);
public static void Blit (Texture source, Material mat, int pass, int destDepthSlice);
public static void Blit (Texture source, RenderTexture dest, Vector2 scale, Vector2 offset, int sourceDepthSlice, int destDepthSlice);

参数

source 源纹理。
dest 目标 RenderTexture。设置为 null 将直接对屏幕执行 blit 操作。有关更多信息,请参阅“说明”。
mat 要使用的材质。例如,材质的着色器可以执行一些后期处理效果。
pass 如果为 -1(默认值),绘制材质中的所有通道。否则,仅绘制给定通道。
offset 应用于源纹理坐标的偏移。
scale 应用于源纹理坐标的缩放。
sourceDepthSlice 要从中执行 blit 操作的纹理数组源切片。
destDepthSlice 要对其执行 blit 操作的纹理数组目标切片。

描述

使用着色器将源纹理复制到目标渲染纹理。

主要用于实现 post-processing effects

Blit 将 dest 设置为渲染目标,在材质上设置 source _MainTex 属性, 并绘制全屏四边形。

如果使用的是内置渲染管线,则当 destnull 时,Unity 将屏幕后备缓冲区用作 blit 目标。但是,如果将主摄像机设置为渲染到 RenderTexture(即 Camera.main 具有非 null 的 targetTexture 属性),则 blit 使用主摄像机的渲染目标作为目标。为确保 blit 确实写入到屏幕后备缓冲区,在调用 Blit 前请务必将 /Camera.main.targetTexture/ 设置为 /null/。
如果使用的是可编程渲染管线(如 HDRP 或通用 RP),并且要使用 Graphics.Blit 对屏幕后备缓冲区执行 blit 操作,则必须从注册为 RenderPipelineManager.endFrameRendering 回调的方法内部调用 Graphics.Blit

注意,如果要使用作为 /source/(渲染)纹理一部分的深度或模板缓冲区, 你必须手动编写等同于 Graphics.Blit 函数的功能 - 即使用目标颜色缓冲区和源深度缓冲区调用 Graphics.SetRenderTarget, 设置正交投影 (GL.LoadOrtho), 设置材质通道 (Material.SetPass) 并绘制一个四边形 (GL.Begin)。

请注意,在线性颜色空间中,设置正确的 sRGB<-> 线性颜色转换 状态非常重要。受之前渲染的内容的影响,当前状态可能不是您预期的状态。 您应考虑在执行 Blit 或任何其他手动渲染之前,将 GL.sRGBWrite 设置为 需要的值。

请注意,如果调用 Blit 时将 sourcedest 设置为相同的 RenderTexture,可能会导致未定义的行为。更好的方法是使用具有双缓冲的自定义渲染纹理,或使用两个自定义渲染纹理并在它们之间交替以手动实现双缓冲。

Graphics.Blit 更改 RenderTexture.active。如果需要在调用 Graphics.Blit 之后使用先前处于活动状态的 RenderTexture,请将该 RenderTexture 记录下来。

另请参阅:Graphics.BlitMultiTapPost-processing effects

using UnityEngine;

public class Example : MonoBehaviour { // Copies aTexture to rTex and displays it in all cameras.

Texture aTexture; RenderTexture rTex;

void Start() { if (!aTexture || !rTex) { Debug.LogError("A texture or a render texture are missing, assign them."); } }

void Update() { Graphics.Blit(aTexture, rTex); } }