Unity 6.3
0 онлайн 115 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 349 из 442

Примеры визуализации вершинных данных в встроенном Render Pipeline

Эти примеры шейдеров для Built-in Render Pipeline демонстрируют различные способы визуализации вершинных данных.

Информацию о записи шейдеров см. в Запись шейдеров.

Визуализация UVs

Следующий пример шейдера визуализирует первый набор UVs сетки. Этот шейдер полезен для отладки координат.

Код определяет структуру с именем appdata как входные данные своего вершинного шейдера. Эта структура принимает на вход положение вершины и первую текстурную координату.

Shader "Debug/UV 1" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
            #include "UnityCG.cginc"

        // vertex input: position, UV
        struct appdata {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 uv : TEXCOORD0;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = float4( v.texcoord.xy, 0, 0 );
            return o;
        }
        
        half4 frag( v2f i ) : SV_Target {
            half4 c = frac( i.uv );
            if (any(saturate(i.uv) - i.uv))
                c.b = 0.5;
            return c;
        }
        ENDHLSL
    }
}
}

Здесь координаты UV визуализированы как красный и зеленый цвета, в то время как дополнительный синий оттенок был применен к координатам вне диапазона от 0 до 1:

Отладка шейдера UV1, примененного к модели торового узла
Отладка шейдера UV1, примененного к модели торового узла

Эта вариация на том же шейдере визуализирует второй набор UV:

Shader "Debug/UV 2" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
            #include "UnityCG.cginc"

        // vertex input: position, second UV
        struct appdata {
            float4 vertex : POSITION;
            float4 texcoord1 : TEXCOORD1;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 uv : TEXCOORD0;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.uv = float4( v.texcoord1.xy, 0, 0 );
            return o;
        }
        
        half4 frag( v2f i ) : SV_Target {
            half4 c = frac( i.uv );
            if (any(saturate(i.uv) - i.uv))
                c.b = 0.5;
            return c;
        }
        ENDHLSL
    }
}
}

Визуализация цветов вершин

Следующий шейдер использует положение вершины и цвета вершины в качестве входов для шейдера вершины (определено в структуре appdata).

Shader "Debug/Vertex color" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, color
        struct appdata {
            float4 vertex : POSITION;
            fixed4 color : COLOR;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color = v.color;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
Debug Colors shader применяется к модели торового узла, в которой освещение запекается в цвета
Debug Colors shader применяется к модели торового узла, в которой освещение запекается в цвета

Визуализация нормалей

Следующий шейдер использует положение вершины и нормаль в качестве входов вершинного шейдера (определено в структуре appdata). Компоненты X,Y и Z нормали визуализируются как цвета RGB. Поскольку компоненты нормали находятся в диапазоне от –1 до 1, мы масштабируем и смещаем их так, чтобы выходные цвета отображались в диапазоне от 0 до 1.

Shader "Debug/Normals" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, normal
        struct appdata {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color.xyz = v.normal * 0.5 + 0.5;
            o.color.w = 1.0;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
Shader Debug Normals применен к модели торового узла. Вы можете видеть, что модель имеет жесткие затеняющие кромки.
Shader Debug Normals применен к модели торового узла. Вы можете видеть, что модель имеет жесткие затеняющие кромки.

Визуализация касательных и бинормальных

Для нормального отображения используются касательные и бинормальные векторы. В Unity только касательный вектор хранится в вершинах, а бинормальный выводится из значений нормы и касания.

Следующий шейдер использует положение вершины и касательную в качестве входов вершинного шейдера (определено в структуре appdata). Компоненты x,y и z касательной визуализируются как цвета RGB. Поскольку нормальные компоненты находятся в диапазоне от –1 до 1, мы масштабируем и смещаем их так, чтобы выходные цвета находились в отображаемом диапазоне от 0 до 1.

Shader "Debug/Tangents" {
SubShader {
    Pass {
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, tangent
        struct appdata {
            float4 vertex : POSITION;
            float4 tangent : TANGENT;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            fixed4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            o.color = v.tangent * 0.5 + 0.5;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
Отладка Шаедер Tangents применен к модели торового узла.
Отладка Шаедер Tangents применен к модели торового узла.

Следующий шейдер визуализирует биттангенсы. Он использует позицию вершины, норму и тангенс в качестве входных данных вершины. Биттангенс (иногда называемый бинормой) рассчитывается из нормы и тангенса. Он должен быть масштабирован и смещен в отображаемый диапазон от 0 до 1.

Shader "Debug/Bitangents" {
SubShader {
    Pass {
        Fog { Mode Off }
        HLSLPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        // vertex input: position, normal, tangent
        struct appdata {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
            float4 tangent : TANGENT;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 color : COLOR;
        };
        
        v2f vert (appdata v) {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex );
            // calculate bitangent
            float3 bitangent = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
            o.color.xyz = bitangent * 0.5 + 0.5;
            o.color.w = 1.0;
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target { return i.color; }
        ENDHLSL
    }
}
}
Отладка шейдера Bitangents, примененного к модели торового узла.
Отладка шейдера Bitangents, примененного к модели торового узла.