Version: 2021.3
LanguageEnglish
  • C#

Graphics.Blit

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Declaration

public static void Blit(Texture source, RenderTexture dest);

Declaration

public static void Blit(Texture source, RenderTexture dest, Material mat, int pass = -1);

Declaration

public static void Blit(Texture source, Material mat, int pass = -1);

Declaration

public static void Blit(Texture source, RenderTexture dest, Vector2 scale, Vector2 offset);

Declaration

public static void Blit(Texture source, RenderTexture dest, int sourceDepthSlice, int destDepthSlice);

Declaration

public static void Blit(Texture source, Material mat, int pass, int destDepthSlice);

Declaration

public static void Blit(Texture source, RenderTexture dest, Vector2 scale, Vector2 offset, int sourceDepthSlice, int destDepthSlice);

Parameters

source Source texture.
dest The destination RenderTexture. Set this to null to blit directly to screen. See description for more information.
mat Material to use. Material's shader could do some post-processing effect, for example.
pass If -1 (default), draws all passes in the material. Otherwise, draws given pass only.
offset Offset applied to the source texture coordinate.
scale Scale applied to the source texture coordinate.
sourceDepthSlice The texture array source slice to perform the blit from.
destDepthSlice The texture array destination slice to perform the blit to.

Description

Copies source texture into destination render texture with a shader.

This is mostly used for implementing post-processing effects.

Blit sets dest as the render target, sets source _MainTex property on the material, and draws a full-screen quad.

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 changes RenderTexture.active. Keep track of the previously active RenderTexture if you need to use it after calling Graphics.Blit.

See Also: Graphics.BlitMultiTap, Post-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); } }