SelfLit с яркостью, зависящей от освещения

Шейдеры и все-все-все.

SelfLit с яркостью, зависящей от освещения

Сообщение AndreyMust19 07 июн 2012, 00:32

Нужно чтобы персонаж, покрашенный в 1 цвет (только диффуз), равномерно подсвечивался, но чтобы яркость подсветки увеличивалась под влиянием источников света (от интенсивности и расстояния). Проще говоря, чтобы источники света не освещали персонажа, а подсвечивали его.

Написал 2 шейдера:

первый
Синтаксис:
Используется glsl
Shader "Level Visibility" {
Properties {
        _Color0 ("Dark", Color) = (0.25,0.25,0.25,1)   
        _Color1 ("Light", Color) = (0.5,0.5,0.5,1)
        _maxlight ("Max intensity", Range (0.1, 8.0)) = 1.0
        _vis ("Level Visibility", Range (0.0, 1.0)) = 0.0
}


SubShader {
        Tags { "RenderType" = "Opaque" }

        CGPROGRAM
        #pragma surface surf WrapLambert

        float4 _Color0, _Color1, _c01, col;
        float _vis;
        float _maxlight;
        float lvis = 0.0f;
        struct Input {
                float a;
        };
       
        half4 LightingWrapLambert (SurfaceOutput s, half3 lightDir, half atten) {
                half NdotL = dot (s.Normal, lightDir);
                half4 c;
                lvis = _LightColor0.s;
                s.Albedo = s.Albedo * _LightColor0.s;
                c.rgb = s.Albedo;
                c.a = s.Alpha;
                return c;
        }

        void surf (Input IN, inout SurfaceOutput o) {
                _c01 = _Color1 - _Color0;
                o.Albedo = _Color0.rgb + _c01 * lvis;
        }
        ENDCG

}

}


Увеличивает яркость объекта (использую куб) при попадании на свет. Усиление подсветки происходит пропорционально интенсивности источника света (использую SpotLight), но не зависит от расстояния до источника света.

второй
Синтаксис:
Используется glsl
Shader "Level Visibility" {
Properties {
        _Color0 ("Dark", Color) = (0.25,0.25,0.25,1)   
        _Color1 ("Light", Color) = (0.5,0.5,0.5,1)
        _maxlight ("Max intensity", Range (0.1, 8.0)) = 1.0
        _vis ("Level Visibility", Range (0.0, 1.0)) = 0.5
}


SubShader {
        Tags { "RenderType" = "Opaque" }
       
        CGPROGRAM
        #pragma surface surf WrapLambert

        float4 _Color0, _Color1, _c01;
        float _vis;
        float _maxlight;
        float lvis;
        struct Input {
                float a;
        };
       
        half4 LightingWrapLambert (SurfaceOutput s, half3 lightDir, half atten) {
                half NdotL = dot (s.Normal, lightDir);
                half4 c;
                lvis = (atten / _maxlight);
                c.rgb = s.Albedo * lvis;
                c.a = s.Alpha;
                return c;
        }

        void surf (Input IN, inout SurfaceOutput o) {
                _c01 = _Color1 - _Color0;
                o.Albedo = _Color0.rgb + _c01 * lvis;
        }
        ENDCG
}

}


Свет просто льется на куб, не подсвечивая его полностью. Световое пятно на кубе того же цвета что и куб (а не цвета луча), но зато яркость пятна увеличивается при приближении к источнику света. То бишь как обычное освещение, только с цветом самого объекта.
Помогите объединить эти два эффекта в один шейдер.
Делаю шейдеры первый раз.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Вернуться в Shader Lab

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

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