source | 源纹理。 |
dest | 目标 RenderTexture 或 GraphicsTexture。 |
mat | 要使用的材质。如果您不提供 mat ,Unity 会使用默认材质。 |
pass | 如果值为 -1 ,Unity 会绘制 mat 中的所有通道。否则,Unity 只会绘制您将 pass 设置为的通道。默认值为 -1 。 |
scale | 要应用的缩放比例。 |
offset | 要应用的偏移量。 |
sourceDepthSlice | 要从中复制的源纹理中的元素,例如纹理数组中的纹理。您不能使用 sourceDepthSlice 指定立方体贴图中的面。 |
destDepthSlice | 要从中复制的目标纹理中的元素,例如纹理数组中的纹理。您不能使用 destDepthSlice 指定立方体贴图中的面。 |
使用着色器将纹理中的像素数据复制到渲染目标中。
此方法将 GPU 上纹理中的像素数据复制到 GPU 上的渲染纹理或图形纹理。这是复制纹理的最快方式之一。
当您使用 Graphics.Blit
时,Unity 会执行以下操作
dest
纹理。(请参阅 RenderTexture.active 和 GraphicsTexture.active。)source
作为 _MainTex
属性传递给 mat
材质。source
纹理绘制一个全屏表面到 dest
纹理。如果您提供的 mat
材质没有 _MainTex
属性,Blit
不会使用 source
。如果您提供一个 GraphicsTexture 作为 dest
,它必须在 GraphicsTextureDescriptor.flags 中启用 GraphicsTextureDescriptorFlags.RenderTarget。
您可以使用 Graphics.Blit
创建 后期处理效果,方法是将 mat
设置为具有自定义着色器的材质。Blit
会更改 RenderTexture.active 和 GraphicsTexture.active。如果您需要在之后使用活动渲染目标,请在使用 Blit
之前存储它。
避免将 source
和 dest
设置为相同的纹理,因为这可能会导致未定义的行为。请改用具有双缓冲的 自定义渲染纹理,或使用两个渲染纹理并在它们之间交替以手动实现双缓冲。
在线性颜色空间中,在使用 Blit
之前设置 GL.sRGBWrite,以确保 sRGB 到线性颜色转换符合您的预期。
要在内置渲染管线中将内容绘制到屏幕上,请执行以下步骤
dest
设置为 null
。Unity 现在会使用 Camera.main.targetTexture
作为目标纹理。null
。要在通用渲染管线 (URP) 或高清渲染管线 (HDRP) 中将内容绘制到屏幕上,您必须在从 RenderPipelineManager.endContextRendering 回调中调用的方法内调用 Graphics.Blit 或 CommandBuffer.Blit。
如果您想使用 source
(渲染)纹理的一部分的深度或模板缓冲区,或将内容绘制到纹理的子区域,您必须手动编写 Graphics.Blit 函数的等效项,即使用目标颜色缓冲区和源深度缓冲区设置 Graphics.SetRenderTarget,设置正交投影(GL.LoadOrtho),设置材质通道(Material.SetPass)并绘制一个四边形(GL.Begin)。
其他资源:Graphics.BlitMultiTap、后期处理效果。
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); } }