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

Методы шейдера в справочнике Встроенный Render Pipeline

Unity имеет ряд встроенных функций в UnityCG.cginc, предназначенных для того, чтобы сделать написание шейдеров проще и легче.

Transform позиций

Функция: Описание:
float4 UnityObjectToClipPos(float3 pos) Преобразует точку из пространства объекта в пространство клипа камеры в однородных координатах. Это эквивалентно mul(UNITY_MATRIX_MVP, float4(pos, 1.0)), и должно использоваться вместо него.
float3 UnityObjectToViewPos(float3 pos) Преобразует точку из объектного пространства в пространство просмотра. Это эквивалентно mul(UNITY_MATRIX_MV, float4(pos, 1.0)).xyz, и должно использоваться вместо него.

Transform другие значения

Функция: Описание:
float3 WorldSpaceViewDir (float4 v) Возвращает направление в мировом пространстве (ненормированное) от заданного положения вершины объекта в пространстве к камере.
float3 ObjSpaceViewDir (float4 v) Возвращает направление пространства объекта (ненормированное) от заданного положения вершины пространства объекта к камере.
float2 ParallaxOffset (half h, half height, half3 viewDir) рассчитывает смещение UV для отображения нормали паралакс.
fixed Luminance (fixed3 c) Преобразует цвет в яркость (градусы серого).
fixed3 DecodeLightmap (fixed4 color) Декодирует цвет из Unity lightmap (RGBM или dLDR в зависимости от платформы).
float4 EncodeFloatRGBA (float v) Кодирует (0..1) диапазон плавающих чисел в цвет RGBA, для хранения в целевом рендеринге низкой точности.
float DecodeFloatRGBA (float4 enc) Декодируется цвет RGBA в плавающее число.
float2 EncodeFloatRG (float v) Кодирует (0..1) диапазон плавания в float2.
float DecodeFloatRG (float2 enc) Декодирует ранее закодированный RG float.
float2 EncodeViewNormalStereo (float3 n) Кодирует пространственную норму в два числа в диапазоне 0..1.
float3 DecodeViewNormalStereo (float4 enc4) Декодируется пространственная нормаль от enc4.xy.

Помощные функции переднего отображения

Эти функции полезны только при использовании прямого рендеринга (ForwardBase или ForwardAdd типы проходов).

Функция: Описание:
float3 WorldSpaceLightDir (float4 v) Вычисляет направление в мировом пространстве (не нормализованное) к свету, заданное положение вершины объекта в пространстве.
float3 ObjSpaceLightDir (float4 v) Вычисляет направление пространства объекта (ненормированное) к свету, заданное положение вершины пространства объекта.
float3 Shade4PointLights (...) Вычисляет освещение от четырех точечных светильников, с данными освещения, плотно упакованными в векторы. Передовое отображение использует это для вычисления освещения по вершинам.

Функции помощника экранного пространства

Следующие функции являются помощниками для вычисления координат, используемых для выборки текстур экранного пространства. Они возвращают float4, где окончательная координата для выборки текстуры может быть вычислена через перспективное деление (например, xy/w).

Функции также заботятся о различиях платформы в координатах рендеринга текстуры.

Функция: Описание:
float4 ComputeScreenPos (float4 clipPos) Вычисляет координаты текстуры для создания образца текстуры, отображаемого в screenspace. Вводом является позиция в пространстве клипа.
float4 ComputeGrabScreenPos (float4 clipPos) Вычисляет координаты текстуры для выборки текстуры GrabPass. Вводом является позиция в пространстве клипа.

Помощные функции с вершинным освещением

Эти функции полезны только при использовании пер-вершинных освещенных шейдеров (тип пропуска «вершин»).

Функция: Описание:
float3 ShadeVertexLights (float4 vertex, float3 normal) Вычисляет освещенность от четырех вершинных источников света и окружающей среды, заданное положение объекта в пространстве и нормаль.

Макросы текстур и семплеров

Макро: Использование:
UNITY_DECLARE_TEX2D(name) Объявляет пару Текстура и Семплер.
UNITY_DECLARE_TEX2D_NOSAMPLER(name) Объявляет текстуру без семплера.
UNITY_DECLARE_TEX2DARRAY(name) Объявляет переменную Sampler массива Texture.
UNITY_SAMPLE_TEX2D(name,uv) Выборка из пары Текстура и Сэмплёр, используя заданные координаты Текстуры.
UNITY_SAMPLE_TEX2D_SAMPLER( name,samplername,uv) Образец из Текстуры (имя), используя Семплер из другой Текстуры (имя семплера).
UNITY_SAMPLE_TEX2DARRAY(name,uv) Образец из массива Текстура с float3 UV; z-компонент координаты является индексом элемента массива.
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) Образец из массива Texture с явным уровнем mipmap.

Макросы теневого отображения

Объявление и выборка теневых карт могут быть очень разными в зависимости от платформы. Unity имеет несколько макросов, чтобы помочь с этим:

Макро: Использование:
UNITY_DECLARE_SHADOWMAP(tex) Заявляет shadowmap Текстура переменной с именем “tex”.
UNITY_SAMPLE_SHADOW(tex,uv) Возвращает текстуру “tex” на заданной координате “uv” (XY компоненты – это местоположение текстуры, Z компонент – глубина, с которой сравнивать). Возвращает одно плавающее значение с термином тени в диапазоне 0..1.
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) Аналогично выше, но читает проективную shadowmap. “uv” является float4, все другие компоненты делятся на .w для выполнения поиска.

Формат tex должен быть RenderTextureFormat.Shadowmap.

NOTE: Не все видеокарты поддерживают shadowmaps. Используйте SystemInfo.SupportsRenderTextureFormat для проверки поддержки.

Помощные макросы текстуры глубины

В большинстве случаев, Depth Texture используется для отображения Depth из Camera. UnityCG.cginc включает файл содержит некоторые макросы, чтобы справиться с вышеуказанной сложностью в этом случае:

  • COMPUTE_EYEDEPTH(i): вычисляет глубину глазного пространства вершины и выводит ее в или. Используйте ее в вершинной программе, когда не отображает текстуру глубины.
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i): даёт высокоточное значение из текстуры глубины и, возвращает соответствующую глубину глазного пространства.
  • Linear01Depth(i): даёт высокоточное значение из текстуры глубины и, возвращает соответствующую линейную глубину в диапазоне от 0 до 1.
  • UNITY_TRANSFER_DEPTH(o): устарел. Вычисляет глубину глазного пространства вершины и выводит ее в или (который должен быть float2). На платформах с текстурами глубины этот макрос не делает ничего, потому что значение Z-буфера отображается имплицитно.
  • UNITY_OUTPUT_DEPTH(i): устарел. Возвращает глубину глазного пространства из и (которая должна быть float2). На платформах с текстурами глубины этот макрос всегда возвращает нуль, потому что значение Z-буфера отображается имплицитно.

Примечание: На DX11/12 и Metal диапазон Z-буфера равен 1-0, а UNITY_REVERSED_Z определен. На других платформах диапазон равен 0-1.

Например, этот шейдер будет отображать глубину его GameObjects:

Shader "Render Depth" {
    SubShader {
        Tags { "RenderType"="Opaque" }
        Pass {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

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

            v2f vert (appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                UNITY_TRANSFER_DEPTH(o.depth);
                return o;
            }

            half4 frag(v2f i) : SV_Target {
                UNITY_OUTPUT_DEPTH(i.depth);
            }
            ENDHLSL
        }
    }
}