Version: 2021.3
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 属性, 并绘制全屏四边形。

To blit to the screen backbuffer in the Built-in Render Pipeline, you must ensure that dest is null, and that the Camera.targetTexture property of Camera.main is also null. If dest is null, Unity tries to use Camera.main.targetTexture as the destination.

To blit to the screen backbuffer in a render pipeline based on the Scriptable Render Pipeline, you must call Graphics.Blit in a method that you call from the RenderPipelineManager.endFrameRendering or RenderPipelineManager.endContextRendering callbacks.

If you want to use a depth or stencil buffer that is part of the source (Render)texture, you have to manually write an equivalent of the Graphics.Blit function - 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).

In Linear color space, it is important to have the correct sRGB<->Linear color conversion state set. Depending on what was rendered previously, the current state might not be the one you expect. You should consider setting GL.sRGBWrite as you need it before doing Blit or any other manual rendering.

A call to Blit with source and dest set to the same RenderTexture may result in undefined behaviour. A better approach is to either use Custom Render Textures with double buffering, or use two RenderTextures and alternate between them to implement double buffering manually.

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); } }