source | The source texture. |
dest | The destination RenderTexture or GraphicsTexture. |
mat | The material to use. If you don't provide mat , Unity uses a default material. |
pass | If the value is -1 , Unity draws all the passes in mat . Otherwise, Unity draws only the pass you set pass to. The default value is -1 . |
scale | The scale to apply. |
offset | The offset to apply. |
sourceDepthSlice | The element in the source texture to copy from, for example the texture in a texture array. You can't use sourceDepthSlice to specify a face in a Cubemap. |
destDepthSlice | The element in the destination texture to copy from, for example the texture in a texture array. You can't use destDepthSlice to specify a face in a Cubemap. |
Uses a shader to copy the pixel data from a texture into a render target.
This method copies pixel data from a texture on the GPU to a render texture or graphics texture on the GPU. This is one of the fastest ways to copy a texture.
When you use Graphics.Blit
, Unity does the following:
dest
texture. (See RenderTexture.active and GraphicsTexture.active.)source
to the mat
material as the _MainTex
property.source
texture to the dest
texture.If you provide a mat
material that doesn't have a _MainTex
property, Blit
doesn't use source
. If you provide a GraphicsTexture as dest
, it must have GraphicsTextureDescriptorFlags.RenderTarget enabled in its GraphicsTextureDescriptor.flags.
You can use Graphics.Blit
to create post-processing effects, by setting mat
to a material with a custom shader.Blit
changes RenderTexture.active and GraphicsTexture.active. Store the active render target before you use Blit
if you need to use it afterwards.
Avoid setting source
and dest
to the same texture, as this may cause undefined behaviour. Use Custom Render Textures with double buffering instead, or use two render textures and alternate between them to implement double buffering manually.
In linear color space, set GL.sRGBWrite before using Blit
, to make sure the sRGB-to-linear color conversion is what you expect.
To blit to the screen in the Built-in Render Pipeline, follow these steps:
dest
to null
. Unity now uses Camera.main.targetTexture
as the destination texture.null
.To blit to the screen in the Universal Render Pipeline (URP) or the High Definition Render Pipeline (HDRP), you must call Graphics.Blit or CommandBuffer.Blit inside a method that you call from the RenderPipelineManager.endContextRendering callback.
If you want to use a depth or stencil buffer that is part of the source
(Render)texture, or blit to a subregion of a 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).
Additional resources: 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); } }