Flat shading без дублирования вершин

Лучший способ помочь другим, поделиться своими находками.

Flat shading без дублирования вершин

Сообщение waruiyume 25 июл 2016, 03:06

Оказывается есть способ отключать интерполяцию, правда я не знаю, между чем и чем, поставив "nointerpolation" в объявлении переменной структуры.
Хотелось бы узнать, что именно происходит.
Синтаксис:
Используется glsl
Shader "Diffuse With Shadows"
{
    Properties
    {
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Pass
        {
            Tags {"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"
 
            // compile shader into multiple variants, with and without shadows
            // (we don't care about any lightmaps yet, so skip these variants)
            #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
            // shadow helper functions and macros
            #include "AutoLight.cginc"
 
            struct v2f
            {
                float2 uv : TEXCOORD0;
                SHADOW_COORDS(1) // put shadows data into TEXCOORD1
                nointerpolation fixed3 diff : COLOR0;
                nointerpolation fixed3 ambient : COLOR1;
                float4 pos : SV_POSITION;
            };
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = v.texcoord;
                half3 worldNormal = UnityObjectToWorldNormal(v.normal);
                half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
                o.diff = nl * _LightColor0.rgb;
                o.ambient = ShadeSH9(half4(worldNormal,1));
                // compute shadows data
                TRANSFER_SHADOW(o)
                return o;
            }
 
            sampler2D _MainTex;
 
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                // compute shadow attenuation (1.0 = fully lit, 0.0 = fully shadowed)
                fixed shadow = SHADOW_ATTENUATION(i);
                // darken light's illumination with shadow, keep ambient intact
                fixed3 lighting = i.diff * shadow + i.ambient;
                col.rgb *= lighting;
                return col;
            }
            ENDCG
        }
 
        // shadow casting support
        UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
    }
}
 

Взято тут http://forum.unity3d.com/threads/solved ... ng.410943/
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Flat shading без дублирования вершин

Сообщение jetyb 26 июл 2016, 08:27

https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb509668(v=vs.85).aspx
Это один из модификаторов данных структуры, задающий метод вычисления структуры в пикселе треугольника по значениям структуры на вершинах.
По дефолту используется вычисление через барицентрические координаты пикселя в треугольнике.
При nointerpolation берется значение первой вершины
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Flat shading без дублирования вершин

Сообщение waruiyume 26 июл 2016, 13:28

Спасибо, действительно используется первая вершина. Я страницу MSDN уже который рас читаю, но всё никак не найду, где же там это написано :-\
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3