Автор Тема: Объединение свойств разных шейдеров  (Прочитано 3946 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Март 15, 2014, 23:03:13 pm
Прочитано 3946 раз

voroshnin_ivan

  • Новичок

  • Оффлайн
  • *

  • 3
  • Репутация:
    0
    • Просмотр профиля
Есть шейдер Dissolve (автор - Роман Сакутин).
По умолчанию у него Diffuse мапа. Как сделать так, чтобы у него были свойства из стандартного Transparent/Cutout/VertexLit шейдера? а из Self-Illuminate/Diffuse?

Сам шейдер:
Shader "Custom/Dissolve" {

Properties {
_MainColor ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_BackTexture ("Back Texture", 2D) = "white" {}
_Mask("Mask To Dissolve", 2D) = "white" {}
_LineTexture("Line Texture", 2D) = "white" {}
_Range ("Range", Range(0,3)) = 0
_LineSize ("LineSize", Float) = 0.001
_Color ("Line Color", Color) = (1,1,1,1)
_BumpMap ("Normalmap", 2D) = "bump" {}
}

SubShader {
LOD 300
ZWrite On
Cull Off

CGPROGRAM
#pragma target 2.0
#include "UnityCG.cginc"
#pragma surface surf Lambert


sampler2D _MainTex;
sampler2D _LineTexture;
sampler2D _BumpMap;
sampler2D _Mask;
sampler2D _BackTexture;
half4 _Color;
half4 _MainColor;
float _Range;
float _LineSize;

struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_Detail;
};

void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color;
half4 bc = tex2D(_BackTexture, IN.uv_MainTex);
o.Albedo = c * _MainColor;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

float factor = m.rgb.x + m.rgb.y + m.rgb.z;
if(factor >= _Range)
{
float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
if(factor2 < _Range || factor3 < _Range)
{
o.Albedo = lc3;
}
else
{
o.Albedo = bc;
o.Normal = float3(1,1,1);
}
}
}
ENDCG
}
Fallback "Diffuse"
}
« Последнее редактирование: Март 15, 2014, 23:08:27 pm от Mimi Neko »

Март 15, 2014, 23:08:12 pm
Ответ #1

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Для офорления кода, нужно использовать кавычки код #
завтра посмотрю, на свежую голову. дело может оказаться весьма непростое...
Какие именно свойства-то нужно чтоб были? и из каких шейдеров какие свойства  брать.
« Последнее редактирование: Март 15, 2014, 23:10:31 pm от Mimi Neko »

Март 20, 2014, 00:56:03 am
Ответ #2

voroshnin_ivan

  • Новичок

  • Оффлайн
  • *

  • 3
  • Репутация:
    0
    • Просмотр профиля
в итоге мне нужны два шейдера на основе Dissolve,
в первом - main color должен светиться, как у self-illumin/diffuse,
а во втором - main color должен быть прозрачным, как у transparent/cutout/diffuse.
и да, normalmap в обоих вариантах хотелось бы вырезать как-то, а то он не нужен.

« Последнее редактирование: Март 21, 2014, 23:18:21 pm от voroshnin_ivan »

Март 20, 2014, 12:12:57 pm
Ответ #3

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
в итоге мне нужны два шейдера на основе Dissolve,
в первом - main color должен светиться, как у self-illumin/diffuse,
а во втором - main color должен быть прозрачным, как у transparent/cutout/diffuse.
и да, normalmap в обоих вариантах хотелось бы вырезать как-то, а то он не нужен.


Извиняюсь, совсем замотался с  работой щас, даже не мог до форума добраться...
Постараюсь попробовать на днях или выходных этих.
« Последнее редактирование: Март 20, 2014, 12:25:42 pm от Mimi Neko »

Март 21, 2014, 23:19:59 pm
Ответ #4

voroshnin_ivan

  • Новичок

  • Оффлайн
  • *

  • 3
  • Репутация:
    0
    • Просмотр профиля

Март 22, 2014, 23:26:53 pm
Ответ #5

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Ну прежде всего, шейдер Dissolve твой, на моей юнити не заработал, а выдал тучу ошибок, этот:

Shader "Custom/Dissolve" {

Properties {
_MainColor ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_BackTexture ("Back Texture", 2D) = "white" {}
_Mask("Mask To Dissolve", 2D) = "white" {}
_LineTexture("Line Texture", 2D) = "white" {}
_Range ("Range", Range(0,3)) = 0
_LineSize ("LineSize", Float) = 0.001
_Color ("Line Color", Color) = (1,1,1,1)
_BumpMap ("Normalmap", 2D) = "bump" {}
}

SubShader {
LOD 300
ZWrite On
Cull Off

CGPROGRAM
#pragma target 2.0
#include "UnityCG.cginc"
#pragma surface surf Lambert


sampler2D _MainTex;
sampler2D _LineTexture;
sampler2D _BumpMap;
sampler2D _Mask;
sampler2D _BackTexture;
half4 _Color;
half4 _MainColor;
float _Range;
float _LineSize;

struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float2 uv_Detail;
};

void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color;
half4 bc = tex2D(_BackTexture, IN.uv_MainTex);
o.Albedo = c * _MainColor;
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));

float factor = m.rgb.x + m.rgb.y + m.rgb.z;
if(factor >= _Range)
{
float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
if(factor2 < _Range || factor3 < _Range)
{
o.Albedo = lc3;
}
else
{
o.Albedo = bc;
o.Normal = float3(1,1,1);
}
}
}
ENDCG
}
Fallback "Diffuse"
}

Вообще с шейдерами на разных версиях Юнити, просто БЯДА!
В юнити от версии к версии, любят что-то так улучшить, что потом проекты даже не запускаются прежние. И обычно, главная проблема - несовместимость шейдеров с версиями юнити.

Я нашёл другой подобный шейдер:

Shader "HolyMonkey/Dissolve/Bumped" {

    Properties {
        _MainColor ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
        _LineTexture("Line Texture", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
        _LineSize ("LineSize", Float) = 0.001
        _Color ("Line Color", Color) = (1,1,1,1)
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
   
    SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 300
        ZWrite On
        Cull Off

        CGPROGRAM
        #pragma target 3.0
        #include "UnityCG.cginc"
        #pragma surface surf Lambert alphatest:_Cutoff
       

        sampler2D _MainTex;
        sampler2D _LineTexture;
        sampler2D _BumpMap;
        sampler2D _Mask;
        half4 _Color;
        half4 _MainColor;
        float _Range;
        float _LineSize;
                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
                        float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            half4 m = tex2D (_Mask, IN.uv_MainTex);
                half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
                half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
            half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color;   
             
                o.Albedo = c *  _MainColor;
                o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                o.Alpha = 1;
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
                  o.Albedo = lc3;
               }
               else
               {
                  o.Alpha = 0.0;
               }
            }
        }
        ENDCG
    }
    Fallback "Diffuse"
}


Взят отсюда:
Пишем Dissolve Shader
http://habrahabr.ru/post/208532/

У  меня он работает, поэтому возьму его за основу.

Март 22, 2014, 23:41:27 pm
Ответ #6

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Убираем из Dissolve, Normal Map:

Shader "HolyMonkey/Dissolve/Bumped" {

    Properties {
        _MainColor ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
        _LineTexture("Line Texture", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
        _LineSize ("LineSize", Float) = 0.001
        _Color ("Line Color", Color) = (1,1,1,1)
//_BumpMap ("Normalmap", 2D) = "bump" {}
        _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
   
    SubShader {
        Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 300
        ZWrite On
        Cull Off

        CGPROGRAM
        #pragma target 3.0
        #include "UnityCG.cginc"
        #pragma surface surf Lambert alphatest:_Cutoff
       

        sampler2D _MainTex;
        sampler2D _LineTexture;
//sampler2D _BumpMap;
        sampler2D _Mask;
        half4 _Color;
        half4 _MainColor;
        float _Range;
        float _LineSize;
                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
                        float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            half4 m = tex2D (_Mask, IN.uv_MainTex);
                half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
                half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
            half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color;   
             
                o.Albedo = c *  _MainColor;
//o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
                o.Alpha = 1;
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
                  o.Albedo = lc3;
               }
               else
               {
                  o.Alpha = 0.0;
               }
            }
        }
        ENDCG
    }
    Fallback "Diffuse"
}


Я просто закомментировал строчки, нужные для Normalmap, но можно их и удалить.
« Последнее редактирование: Март 22, 2014, 23:43:01 pm от Mimi Neko »

Март 23, 2014, 01:04:20 am
Ответ #7

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Упрощённый Dissolve с двумя текстурами:

Shader "HolyMonkey/Dissolve/NotTransparent" {

    Properties {
        _MainColor ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BackTexture ("Back Texture", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
//_LineTexture("Line Texture", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
//_LineSize ("LineSize", Float) = 0.001
_Color ("Line Color", Color) = (1,1,1,1)
//_BumpMap ("Normalmap", 2D) = "bump" {}


    }
   
    SubShader {
        LOD 300
        ZWrite On
        Cull Off
       
        CGPROGRAM
        #pragma target 2.0
        #include "UnityCG.cginc"
        #pragma surface surf Lambert
       

        sampler2D _MainTex;
sampler2D _LineTexture;
//sampler2D _BumpMap;
        sampler2D _Mask;
        sampler2D _BackTexture;
half4 _Color;
        half4 _MainColor;
        float _Range;
float _LineSize;

                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color;   
            half4 bc  = tex2D(_BackTexture, IN.uv_MainTex);
            o.Albedo = c *  _MainColor;
//o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
o.Albedo = lc3;
               }
               else
               {
                  o.Albedo = bc;
                  //o.Normal = float3(1,1,1);
               }
            }
        }
        ENDCG
    }
    Fallback "Diffuse"
}

Март 23, 2014, 01:06:36 am
Ответ #8

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Вот исходник стандартного шейдера Self-Illumin/Diffuse:

Shader "Self-Illumin/Diffuse" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_Illum ("Illumin (A)", 2D) = "white" {}
_EmissionLM ("Emission (Lightmapper)", Float) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _Illum;
fixed4 _Color;

struct Input {
float2 uv_MainTex;
float2 uv_Illum;
};

void surf (Input IN, inout SurfaceOutput o) {
fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
fixed4 c = tex * _Color;
o.Albedo = c.rgb;
o.Emission = c.rgb * UNITY_SAMPLE_1CHANNEL(_Illum, IN.uv_Illum);
o.Alpha = c.a;
}
ENDCG
}
FallBack "Self-Illumin/VertexLit"
}



Хорошо что оба шейдера Ламберт. однотипные проще совмещать.
(точнее, как совмещать ламберт с не  ламберт-шейдером, я до сих пор нигде не нашёл)
« Последнее редактирование: Март 23, 2014, 02:03:50 am от Mimi Neko »

Март 23, 2014, 01:30:23 am
Ответ #9

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Сделал совмещённый шейдер Dissolve-NotTransparent + Self-IlluminDiffuse:
(закомментированые строчки можно удалить)

Shader "Custom/DissolveNoTSelf-IlluminDiffuse" {

    Properties {
        _MainColor ("Main Color", Color) = (1,1,1,1)
//_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}

        _BackTexture ("Back Texture", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
//_LineTexture("Line Texture", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
//_LineSize ("LineSize", Float) = 0.001
//_Color ("Line Color", Color) = (1,1,1,1)
//_BumpMap ("Normalmap", 2D) = "bump" {}

_Illum ("Illumin (A)", 2D) = "white" {}
_EmissionLM ("Emission (Lightmapper)", Float) = 0
    }
   
    SubShader {
Tags { "RenderType"="Opaque" }
        LOD 300
        ZWrite On
        Cull Off
       
        CGPROGRAM
        #pragma target 2.0
        #include "UnityCG.cginc"
        #pragma surface surf Lambert
       

        sampler2D _MainTex;
sampler2D _LineTexture;
//sampler2D _BumpMap;
        sampler2D _Mask;
        sampler2D _BackTexture;
//half4 _Color;
        half4 _MainColor;
        float _Range;
float _LineSize;
sampler2D _Illum;
                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
float2 uv_Illum;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {

//half4 c = tex2D (_MainTex, IN.uv_MainTex);

fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
fixed4 c = tex * _MainColor;
o.Albedo = c.rgb;
o.Emission = c.rgb * UNITY_SAMPLE_1CHANNEL(_Illum, IN.uv_Illum);
o.Alpha = c.a;

            half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime);   
            half4 bc  = tex2D(_BackTexture, IN.uv_MainTex);
//o.Albedo = c *  _MainColor;
//o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
o.Albedo = lc3;
               }
               else
               {
                  o.Albedo = bc;
//o.Normal = float3(1,1,1);
               }
            }
        }
        ENDCG
    }
    Fallback "Diffuse"
}


Вот работа  шейдера:
слева - совмещённый, справа -  обычный диссольв
« Последнее редактирование: Март 23, 2014, 12:46:41 pm от Mimi Neko »

Март 23, 2014, 02:03:18 am
Ответ #10

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Исходник второго стандартного шейдера: Transparent/Cutout/Diffuse

Shader "Transparent/Cutout/Diffuse" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}

SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
LOD 200

CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff

sampler2D _MainTex;
fixed4 _Color;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}

Fallback "Transparent/Cutout/VertexLit"
}


Март 23, 2014, 02:22:08 am
Ответ #11

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Сделал второй совмещённый шейдер  Custom Dissolve + Transparent/Cutout/Diffuse

Shader "Custom/DissolveTransparentCutoutDiffuse" {

    Properties {
        _MainColor ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BackTexture ("Back Texture", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
//_LineTexture("Line Texture", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
//_LineSize ("LineSize", Float) = 0.001
//_Color ("Line Color", Color) = (1,1,1,1)
//_BumpMap ("Normalmap", 2D) = "bump" {}

_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
   
    SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 300
        ZWrite On
        Cull Off
       
        CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff
        #pragma target 2.0
        #include "UnityCG.cginc"
//#pragma surface surf Lambert
       

        sampler2D _MainTex;
sampler2D _LineTexture;
//sampler2D _BumpMap;
        sampler2D _Mask;
        sampler2D _BackTexture;
//half4 _Color;
        half4 _MainColor;
        float _Range;
float _LineSize;

                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {

fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _MainColor;
o.Albedo = c.rgb;
o.Alpha = c.a;

//o.Albedo = c *  _MainColor;

//half4 c = tex2D (_MainTex, IN.uv_MainTex);
            half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime);   
            half4 bc  = tex2D(_BackTexture, IN.uv_MainTex) * _MainColor;
           
//o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
o.Albedo = lc3;
               }
               else
               {
                  o.Albedo = bc;
                  //o.Normal = float3(1,1,1);
               }
            }
        }
        ENDCG
    }
    Fallback "Diffuse"
}

Результат:
слева - совмещённый шейдер, посредине -диссольв, справа - транспарент кутофф
« Последнее редактирование: Март 23, 2014, 12:46:23 pm от Mimi Neko »

Март 25, 2014, 00:00:12 am
Ответ #12

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Вот доработанный совмещённый шейдер  Custom Dissolve + Transparent/Cutout/Diffuse
В предыдущей версии, некорректно обрабатывались тени.

Shader "Custom/DissolveTransparentCutoutDiffuse" {


    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base Texture Trans (A)", 2D) = "white" {}
        _BackTexture ("Back Texture Trans (A)", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }
   
    SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 300
        ZWrite On
        Cull Off
       
        CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff
        #pragma target 2.0
        #include "UnityCG.cginc"

        sampler2D _MainTex;
sampler2D _LineTexture;
        sampler2D _Mask;
        sampler2D _BackTexture;
        fixed4 _Color;
        float _Range;
float _LineSize;

                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_BumpMap;
            float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {

fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;

//half4 c = tex2D (_MainTex, IN.uv_MainTex);
//o.Albedo = c *  _Color;

            half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime);   
            half4 bc  = tex2D(_BackTexture, IN.uv_MainTex);
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
o.Albedo = lc3;
               }
               else
               {
                  o.Albedo = bc;
               }
            }


        }
        ENDCG
    }
Fallback "Transparent/Cutout/VertexLit"
}

Март 26, 2014, 13:48:12 pm
Ответ #13

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Dissolve + Transparent Cutout VertexLit

Shader "Custom/DissolveTransparentCutoutVertexLit" {


    Properties {
        _Color ("Main Color", Color) = (1,1,1,1)

_Emission ("Emissive Color", Color) = (0,0,0,0)

        _MainTex ("Base Texture Trans (A)", 2D) = "white" {}
        _BackTexture ("Back Texture Trans (A)", 2D) = "white" {}
        _Mask("Mask To Dissolve", 2D) = "white" {}
        _Range ("Range", Range(0,3)) = 0
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
    }



   
    SubShader {
Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        LOD 300
        ZWrite On
        Cull Off
       
        CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff

        #pragma target 2.0
        #include "UnityCG.cginc"

        sampler2D _MainTex;
sampler2D _LineTexture;
        sampler2D _Mask;
        sampler2D _BackTexture;
        fixed4 _Color;
        float _Range;
float _LineSize;
half3 _Emission;

                   
        struct Input {
            float2 uv_MainTex;
            float2 uv_Detail;
        };
           
        void surf (Input IN, inout SurfaceOutput o) {

fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;

o.Emission = _Emission.rgb;
o.Albedo = c.rgb;
o.Alpha = c.a;


            half4 m = tex2D (_Mask, IN.uv_MainTex);
half4 lc =  tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);
half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime);   
            half4 bc  = tex2D(_BackTexture, IN.uv_MainTex);
           
            float factor = m.rgb.x + m.rgb.y + m.rgb.z;
            if(factor >= _Range)
            {
               float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
               float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
               if(factor2 < _Range || factor3 < _Range)
               {
o.Albedo = lc3;
               }
               else
               {
                  o.Albedo = bc;
               }
            }


        }
        ENDCG
    }
Fallback "Transparent/Cutout/VertexLit"
}
 

Март 28, 2014, 19:24:47 pm
Ответ #14

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Переписал шейдер по другому: Dissolve + Transparent Cutout + Maxlight
Теперь можно устанавливать не только цвет эмиссии, но и интенсивность цветов!

Shader "Custom/DissolveTransparentCutoutMaxlight" {

Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_maxlight ("Color intensity", Range (0.1, 8.0)) = 1.0

_Emission ("Emissive Color", Color) = (0,0,0,0)

_MainTex ("Main Texture (A)", 2D) = "white" {}
_BackTexture ("Back Texture (A)", 2D) = "white" {}

_Mask("Mask To Dissolve", 2D) = "white" {}
_Range ("Range", Range(0,3)) = 0

_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}

SubShader {

Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
LOD 300


CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff

sampler2D _MainTex;
sampler2D _BackTexture;
sampler2D _Mask;
float _Range;
fixed4 _Color;
float _LineSize;
float _maxlight;
half3 _Emission;


struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {

fixed4 c;

half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize);
half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize);

float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z;
float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z;
if(factor2 < _Range || factor3 < _Range)
{
c = tex2D(_MainTex, IN.uv_MainTex);
}else{
c = tex2D(_BackTexture, IN.uv_MainTex);
}

c.rgb *= _maxlight;
o.Emission = _Emission.rgb;

o.Albedo = c.rgb * _Color;
o.Alpha = c.a;

}
ENDCG


}

Fallback "Transparent/Cutout/VertexLit"
}