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

Пример шейдера нормалей сетки во Встроенном Render Pipeline

Кот-подобный символ, отображаемый разными цветами, которые представляют направление, в котором обращена каждая поверхность.
Кот-подобный символ, отображаемый разными цветами, которые представляют направление, в котором обращена каждая поверхность.
Shader "Unlit/WorldSpaceNormals"
{
    // no Properties block this time!
    SubShader
    {
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // include file that contains UnityObjectToWorldNormal helper function
            #include "UnityCG.cginc"

            struct v2f {
                // we'll output world space normal as one of regular ("texcoord") interpolators
                half3 worldNormal : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            // vertex shader: takes object space normal as input too
            v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(vertex);
                // UnityCG.cginc file contains function to transform
                // normal from object to world space, use that
                o.worldNormal = UnityObjectToWorldNormal(normal);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 c = 0;
                // normal is a 3D vector with xyz components; in -1..1
                // range. To display it as color, bring the range into 0..1
                // and put into red, green, blue components
                c.rgb = i.worldNormal*0.5+0.5;
                return c;
            }
            ENDHLSL
        }
    }
}

Кроме того, что они дают красивые цвета, нормы используются для всех видов графических эффектов – освещения, отражений, силуэтов и так далее.

В приведенном выше шейдере мы начали использовать один из встроенных в Unity файлов включаемые файлы шейдеров. Здесь использовались UnityCG.cginc, которые содержат удобную функцию UnityObjectToWorldNormal. Мы также использовали полезную функцию UnityObjectToClipPos, которая преобразует вершину из объектного пространства в экран. Это просто делает код более читаемым и более эффективным при определенных обстоятельствах.

Мы видели, что данные могут передаваться из вершины в шейдер фрагмента в так называемых “интерполяторах” (или иногда называемых “вариациях”). В языке шейдера HLSL они обычно помечены TEXCOORDn семантическим, и каждый из них может быть до 4-компонентного вектора (см. Ввод данных вершины в шейдер для подробностей).

Также мы выучили простую технику визуализации нормализованных векторов (в диапазоне от –1.0 до +1.0) в виде цветов: просто умножайте их наполовину и добавляйте половину. Для дополнительных примеров визуализации вершинных данных, см. Визуализация вершинных данных.