source | 源纹理。 |
dest | 目标 RenderTexture。设置为 null 将直接对屏幕执行 blit 操作。有关更多信息,请参阅“说明”。 |
mat | 要使用的材质。例如,材质的着色器可以执行一些后期处理效果。 |
pass | 如果为 -1(默认值),绘制材质中的所有通道。否则,仅绘制给定通道。 |
offset | 应用于源纹理坐标的偏移。 |
scale | 应用于源纹理坐标的缩放。 |
sourceDepthSlice | 要从中执行 blit 操作的纹理数组源切片。 |
destDepthSlice | 要对其执行 blit 操作的纹理数组目标切片。 |
使用着色器将源纹理复制到目标渲染纹理。
主要用于实现 post-processing effects。
Blit 将 dest
设置为渲染目标,在材质上设置 source
_MainTex
属性,
并绘制全屏四边形。
如果使用的是内置渲染管线,则当 dest
为 null
时,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 时将 source
和 dest
设置为相同的 RenderTexture,可能会导致未定义的行为。更好的方法是使用具有双缓冲的自定义渲染纹理,或使用两个自定义渲染纹理并在它们之间交替以手动实现双缓冲。
Graphics.Blit 更改 RenderTexture.active。如果需要在调用 Graphics.Blit 之后使用先前处于活动状态的 RenderTexture,请将该 RenderTexture 记录下来。
另请参阅: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); } }