Unity 6.3
0 онлайн 13 гостей 3 в системе
Вход

Graphics.Blit

Declaration

public static void Blit(Texture source, Material mat, int pass = -1);
public static void Blit(Texture source, Material mat, int pass, int destDepthSlice);
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, RenderTexture dest, Vector2 scale, Vector2 offset);
public static void Blit(Texture source, RenderTexture dest, int sourceDepthSlice, int destDepthSlice);
public static void Blit(Texture source, RenderTexture dest, Vector2 scale, Vector2 offset, int sourceDepthSlice, int destDepthSlice);
public static void Blit(Texture source, Rendering.GraphicsTexture dest);
public static void Blit(Texture source, Rendering.GraphicsTexture dest, Material mat, int pass = -1);
public static void Blit(Texture source, Rendering.GraphicsTexture dest, Vector2 scale, Vector2 offset);
public static void Blit(Texture source, Rendering.GraphicsTexture dest, int sourceDepthSlice, int destDepthSlice);
public static void Blit(Texture source, Rendering.GraphicsTexture dest, Vector2 scale, Vector2 offset, int sourceDepthSlice, int destDepthSlice);

Параметры

Параметр Описание
источник Исходная текстура.
рука Место назначения RenderTexture или GraphicsTexture.
мат Материал для использования. Если вы не указываете mat, Unity использует материал по умолчанию.
пропуск Если значением является -1, то Unity рисует все проходы в mat. В противном случае Unity рисует только проход, на который установлен pass. Значение по умолчанию — -1.
шкала Масштаб, который будет применен к исходной текстуре. Unity использует это значение масштаба для умножения UVs, которое используется для выборки исходной текстуры.
офсет Смещение, которое будет применено к исходной текстуре. Unity добавляет это значение смещения к UVs перед семплингом исходной текстуры. Смещение не зависит от масштаба, так как Unity добавляет смещение только после применения масштаба.
sourceDepthSlice Элемент в исходной текстуре, из которого будет копироваться текстура, например текстура в массиве текстур. Вы не можете использовать sourceDepthSlice для указания поверхности в кубическом отображении.
destDepthSlice Элемент в текстуре назначения для копирования, например текстура в массиве текстур. Вы не можете использовать destDepthSlice для указания поверхности в кубическом отображении.

Описание

Использует шейдер для копирования данных пикселей из текстуры в цель рендеринга.

Этот метод копирует пиксельные данные из текстуры на GPU в текстуру рендеринга или графическую текстуру на GPU. Это один из самых быстрых способов копирования текстуры.

При использовании Graphics.BlitUnity выполняет следующие действия:

  1. Устанавливает текстуру dest в качестве активного объекта рендеринга. (См. RenderTexture.active и GraphicsTexture.active.)
  2. Передаёт source материалу mat в качестве свойства _MainTex.
  3. Использует шейдер материала для рисования полноэкранной поверхности от текстуры source до текстуры dest.

Если переданный mat материал не содержит свойства _MainTex, метод Blit не использует source. Если передаётся GraphicsTexture в качестве dest, для него должен быть включён GraphicsTextureDescriptorFlags.RenderTarget в GraphicsTextureDescriptor.flags.

С помощью Graphics.Blit можно создавать эффекты постобработки, назначив mat материал с пользовательским шейдером.

При этом Blit изменяет RenderTexture.active и GraphicsTexture.active. Если после вызова Blit потребуется активная цель рендеринга, сохраните её заранее.

Не назначайте одну и ту же текстуру параметрам source и dest: это может привести к неопределённому поведению. Вместо этого используйте Настраиваемые текстуры с двойной буферизацией либо две текстуры, попеременно переключаясь между ними вручную.

В линейном цветовом пространстве задайте GL.sRGBWrite перед вызовом Blit, чтобы преобразование из sRGB в линейное пространство выполнялось ожидаемым образом.

Чтобы выполнить blit на экран во встроенном рендер-конвейере, сделайте следующее:

  1. Установите dest на null. Unity теперь использует Camera.main.targetTexture в качестве текстуры назначения.
  2. Установите свойство Camera.targetTexture для Camera.main на null.

Чтобы блит на экран в Universal Render Pipeline (URP) или High Definition Render Pipeline (HDRP), вы должны позвонить Graphics.Blit или CommandBuffer.Blit внутри метода, который вы вызываете из RenderPipelineManager.endContextRendering обратный вызов.

Если вы хотите использовать буфер глубины или шаблона, который является частью source (Render)texture, или blit к субрегиону текстуры, вам придется вручную написать эквивалент текстуры, Graphics.Blit функция — i.e. Graphics.SetRenderTarget с буфером цвета назначения и буфером глубины источника, установка ортографической проекции (GL.LoadOrtho), настройка материала пропуска (Material.SetPass) и нарисовать четверку (GL.Begin).

Дополнительные ресурсы: Graphics.BlitMultiTap, Последствия после обработки.

using UnityEngine;

public class Example : MonoBehaviour { 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); } }

Копирует aTexture в rTex и отображает его на всех камерах.

using UnityEngine;

public class Fisheye : MonoBehaviour { public Texture sourceTexture; public RenderTexture targetRenderTexture; public Material fishEyeMaterial;

void Update() { // Apply the fish-eye effect every frame Graphics.Blit(sourceTexture, targetRenderTexture, fishEyeMaterial); } }

Выполнить Blit от текстуры источника к текстуре назначения с помощью пользовательского блит-шайдера, назначенного в поле fishEyeMaterial.

          Shader "Custom/FishEyeShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Distortion ("Distortion Strength", Range(0, 1)) = 0.5
    }
    SubShader
    {
        Pass
        {
            ZTest Always
            Cull Off
            ZWrite Off

CGPROGRAM #pragma vertex vert #pragma fragment frag

sampler2D _MainTex; float _Distortion;

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; };

v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; }

float4 frag(v2f i) : COLOR { float2 uv = i.uv; float2 center = float2(0.5, 0.5); // Center of the texture

// Fisheye distortion float2 diff = uv - center; float dist = length(diff); diff *= pow(_Distortion, dist);

uv = center + diff; // Apply distortion return tex2D(_MainTex, uv); } ENDCG } } }

Код шейдера для эффекта рыбьего глаза.