Страница 1 из 1

Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 18 апр 2011, 16:05
Ursus
Стандартный материал Transparent/Bumped Specular использует для трансперенси и спекуляра один и тот же канал текстуры диффуз (альфаканал), что на практике очень не удобно. До версии 3.0 существовали шейдера, использующие альфаканал текстуры нормал-мап. Но сейчас, из-за особого способа компрессии нормал-мапа этот путь сомнителен. Хотелось бы найти решение (или готовый шейдер) для выполнения условия Transparent/Bumped Specular с различными текстурами для спекуляра и трансперенси.

Re: Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 18 апр 2011, 18:12
MysTer92
Допилил стандартный шейдер. Сделал отдельный слот для глосси-текстуры, юзает альфа канал.
Синтаксис:
Используется csharp
Shader "Transparent/Bumped Specular Separated Gloss" {
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
        _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
        _MainTex ("Base (RGB) Transparent (A)", 2D) = "white" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _GlossTex ("Gloss (A)", 2D) = "white" {}
}

SubShader {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        LOD 400
       
CGPROGRAM
#pragma surface surf BlinnPhong alpha

sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _GlossTex;
fixed4 _Color;
half _Shininess;

struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
};

void surf (Input IN, inout SurfaceOutput o) {
        fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
        fixed gloss = tex2D(_GlossTex, IN.uv_MainTex).a;
        o.Albedo = tex.rgb * _Color.rgb;
        o.Gloss = gloss;
        o.Alpha = tex.a * _Color.a;
        o.Specular = _Shininess;
        o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
ENDCG
}

FallBack "Transparent/VertexLit"
}

Re: Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 18 апр 2011, 18:19
gnoblin
упс, я на пару минут опоздал )).

Re: Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 18 апр 2011, 22:25
Ursus
Невероятно! Спасибо!
Сожалею, что всё ещё нет времени засесть за шейдера.
Но последние опыты показали, что также имеется необходимость использовать колорную текстуру с глоссом из её альфаканала, а трансперенси из отдельной текстуры. В идеале, конечно, брать чёрно-белую инфу из последней текстуры непосредственно из чёрно-белого Tex, экономя в памяти за счёт убирания её Alpha...

Re: Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 18 апр 2011, 22:40
MysTer92
Тогда так
Синтаксис:
Используется csharp
Shader "Transparent/Bumped Specular Separated Alpha" {
 Properties {
         _Color ("Main Color", Color) = (1,1,1,1)
         _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0)
         _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
         _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
         _BumpMap ("Normalmap", 2D) = "bump" {}
         _AlphaTex ("Transparent (RGB)", 2D) = "white" {}
}

 SubShader {
         Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
         LOD 400
         
 CGPROGRAM
#pragma surface surf BlinnPhong alpha

 sampler2D _MainTex;
 sampler2D _BumpMap;
 sampler2D _AlphaTex;
 fixed4 _Color;
 half _Shininess;

struct Input {
         float2 uv_MainTex;
         float2 uv_BumpMap;
};

void surf (Input IN, inout SurfaceOutput o) {
         fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
         fixed3 alpha = tex2D(_AlphaTex, IN.uv_MainTex).rgb;
         o.Albedo = tex.rgb * _Color.rgb;
         o.Gloss = tex.a;
         o.Alpha = alpha * _Color.a;
         o.Specular = _Shininess;
         o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
}
 ENDCG
}

 FallBack "Transparent/VertexLit"
}

Re: Transparent/Bumped Specular (Separated Textures)

СообщениеДобавлено: 19 апр 2011, 01:38
Ursus
Огромное спасибо! В итоге на всех частях модели теперь всё работает, как и задумывалось.