Помогите изменить шейдер для лайтмапы

Для экспериментальных разработок и тем "я нашел чужой исходник, почему он не работает?"

Помогите изменить шейдер для лайтмапы

Сообщение Diab10 13 авг 2013, 17:03

Всем привет. Мне нужно на модель наложить дифуз карту, и карту лайтмап. Для этого я нашёл такой шейдер:

Синтаксис:
Используется csharp
    Shader "Warsoup/Lighting" {
    Properties {
        _Color ("Base Color", Color) = (1,1,1,0.5)
        DiffuseTexture ("Diffuse Texture", 2D) = "white" { }
        _LightMap ("LightMap", 2D) = "white" {}
    }
    SubShader {
        Pass {
                        Tags {"LightMode" = "Vertex"}
                        Lighting On
     
            CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members uv1,uv2)
#pragma exclude_renderers d3d11 xbox360
            #pragma vertex vert
            #pragma fragment frag
     
            #include "UnityCG.cginc"
     
            float4      _Color;
            sampler2D   DiffuseTexture;
            sampler2D   _LightMap;
           
            float4 DiffuseTexture_ST;
            float4 _LightMap_ST;
     
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv1;
                float2  uv2;
            };
     
            struct InputVS {
                float4 vertex : POSITION;
                float4 tangent : TANGENT;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
                float4 texcoord1 : TEXCOORD1;
            };
           
            v2f vert (InputVS v)
            {
                v2f o;
                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                o.uv1 = TRANSFORM_TEX (v.texcoord, DiffuseTexture);
                o.uv2 = TRANSFORM_TEX (v.texcoord1, _LightMap);
                return o;
            }
     
            half4 frag (v2f i) : COLOR
            {
                half4 texcol = tex2D (DiffuseTexture, i.uv1);
                half4 lightmap = tex2D (_LightMap, i.uv2);
                return texcol*lightmap;
            }
            ENDCG
     
        }
    }
    Fallback "VertexLit"
    }


Он работает, лайтмапа накладывается. Но на поверхность не действуют источники света. Скрин:
http://joxi.ru/LTwKUtg5CbA4eLDc6fI
На яме свет от поинт-лайта есть, а на полу - нету. К полу применён данный шейдер с лайтмапой.

Помогите пожалуйста поправить, чтобы пол тоже освещался :(
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Помогите изменить шейдер для лайтмапы

Сообщение Diab10 13 авг 2013, 17:05

Вот ещё скрины:

На полу обычный дуффуз шейдер, свет падает:
http://joxi.ru/1zwKUtg5CbA8eAzGNvo
На полу шейдер с лайтмапой, свет не падает:
http://joxi.ru/Cz0KUtg5CbBbePwaPaw
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Помогите изменить шейдер для лайтмапы

Сообщение WhiteDevil 13 авг 2013, 18:56

Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Помогите изменить шейдер для лайтмапы

Сообщение Diab10 14 авг 2013, 19:07

WhiteDevil писал(а):Тренируйся


Спасибо, но там ничего полезного не нашёл :(

Выкинул этот шейдер, и после нескольких десяток попыток доработал обычный диффуз шейдер методом тыка - добавил лайтмапу. Всё работает :D


Мб кому понадобится:

Синтаксис:
Используется csharp
    Shader "My Shaders/LightMap Diffuse" {
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
    _LightMap ("LightMap", 2D) = "white" {}
}
SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _LightMap;
fixed4 _Color;

struct Input {
        float2 uv_MainTex;
        float2 uv2_LightMap;
};

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

Fallback "VertexLit"
}


Зачем этот шейдер нужен? Можно в 3Д максе запечь лайтмапу в отдельную текстуру, и наложить лайтмапу на модель при помощи этого шейдера.
Это нужно в том случае, если текстура затайлена на объекте. Если текстура не затайлена, то можно в 3Д максе лайтмапу запечь в саму Diffuse текстуру - тогда этот шейдер не нужен
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Помогите изменить шейдер для лайтмапы

Сообщение Diab10 14 авг 2013, 19:14

UPD:

А вот теперь ссылочка помогла)
Добавил ещё и бамп:

Синтаксис:
Используется csharp
    Shader "My Shaders/LightMap Bumped Diffuse" {
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
    _BumpMap ("Bumpmap", 2D) = "bump" {}
    _LightMap ("LightMap", 2D) = "white" {}
}
SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _LightMap;
fixed4 _Color;

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

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

Fallback "VertexLit"
}
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023


Вернуться в Шейдерная кузня

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

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