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

Помогите допилить универсальный шейдер.

СообщениеДобавлено: 22 июл 2012, 15:02
NOVA
Универсальный для неорганических объектов. lightmapped bumped specular reflective cutout. Так чтоли))
Сам автор пока в отпуске. Но срочно надо.
Вот так оно выглядит в определённом месте.

Скрытый текст:
Изображение


Скрытый текст:
Shader "Nova/RealLM/BumpedSpecular"

{
Properties {



_SpecColor ("Specular Color", Color) = (0.5,0.5,0.5, 1)

_Shininess ("Shininess", Range (0.03, 1)) = 0.078125

_LmIntensity("Light map intensity", Range(0,1)) = 1

_MainTex ("Base (RGB)", 2D) = "white" {}

_NSMap ("Normal Spec map", 2D) = "bump" {}

_LightMap ("Lightmap (RGB)", 2D) = "black" {}

}



SubShader {

LOD 200

Tags { "RenderType" = "Opaque" }

CGPROGRAM

#pragma surface surf BlinnPhong

struct Input {

float2 uv_MainTex;

float2 uv_NSMap;

float2 uv2_LightMap;


};

sampler2D _MainTex;

sampler2D _LightMap;

sampler2D _NSMap;

float4 _Color;

float _Shininess;
float _LmIntensity;



void surf (Input IN, inout SurfaceOutput o)

{
float4 diffuse = tex2D(_MainTex, IN.uv_MainTex);
half4 tex = tex2D (_MainTex, IN.uv_MainTex);

half4 lm = tex2D (_LightMap, IN.uv2_LightMap);


o.Albedo = lm.rgb * diffuse.rgb * _LmIntensity ;
o.Emission = lm.rgb*o.Albedo.rgb;

o.Gloss = tex.a;

o.Alpha = lm.a * _Color.a;

o.Specular = _Shininess;

float4 normal = tex2D(_NSMap, IN.uv_MainTex);
o.Normal = UnpackNormal(normal);


}

ENDCG

}

FallBack "Legacy Shaders/Lightmapped/VertexLit"

}

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 22 июл 2012, 17:19
Woolf
Не помогу, лень, вот только reflective вам зачем о_О? Это, как-бы, совсем не универсальная вещь.. С остальным согласен, сам такой шейдер (тока без лайтмапы) делал.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 22 июл 2012, 21:12
NOVA
Если кто не в курсе, то кубамапа очень похоже на hdri. Если мы отрендерим кубамапу так, что источники света будут намного ярче окружения то получим нечто похожее. Она к тому же не мешает, если её отключить.
o.Emission = lightMap.rgb * o.Albedo.rgb * _LmIntensity + reflcol.rgb * (1 - normal.a) * _ReflectIntensity

Удаляем вот это: * _ReflectIntensity и всё.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 23 июл 2012, 12:10
Battle Angel Alita
Синтаксис:
Используется glsl
//o.Albedo = diffuse.rgb;
..
o.Emission = lightMap.rgb * diffuse.rgb * _LmIntensity + reflcol.rgb * (1 - normal.a) * _ReflectIntensity;

как то так

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 23 июл 2012, 16:35
NOVA
Спасибки). Выглядит вроде как надо, только вот свет теперь от реальных источников не принимает((

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 23 июл 2012, 17:28
MysTer92
Может лучше так? Вроде как альбедо для диффуза и освещения, а эмишн для самосвечения и отражений.
Синтаксис:
Используется glsl
o.Albedo = lightMap.rgb * diffuse.rgb * _LmIntensity;
...
o.Emission = reflcol.rgb * (1 - normal.a) * _ReflectIntensity;

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 23 июл 2012, 19:11
NOVA
Material doesn't have a texture property '_LightMap'
UnityEditor.DockArea:OnGUI()
Где-то 5 сообщений по всем картам. Всё розового цвета.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 24 июл 2012, 16:59
MysTer92
Нужно было переменную лайтмап объявить выше, до альбедо, вместе с фетчем текстуры. Проглядел.
Вот так в общем:
Синтаксис:
Используется glsl
Shader "Phantom/Mega"
{
 Properties
 {
 _ReflectIntensity ("Reflection Intensity", Range(0,1)) = 0.5
 _LmIntensity("Light map intensity", Range(0,1)) = 1
 _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5

 _MainTex ("Base (RGB) RefStrength (A)", 2D) = "white" {}
 _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
 _NSMap ("Normal Spec map", 2D) = "bump" {}
 _LightMap ("Lightmap", 2D) = "white" {}
 }

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

 CGPROGRAM
 #pragma surface surf Lambert alphatest:_Cutoff

 sampler2D _MainTex;
 sampler2D _NSMap;
 sampler2D _LightMap;
 samplerCUBE _Cube;

 float _ReflectIntensity;
 float _BumpColor;
 float _LmIntensity;

 struct Input
 {
 float2 uv_MainTex;
 float2 uv2_LightMap;
 float3 worldRefl;
 INTERNAL_DATA
 };

 void surf (Input IN, inout SurfaceOutput o)
 {
 float4 diffuse = tex2D(_MainTex, IN.uv_MainTex);

 float4 normal = tex2D(_NSMap, IN.uv_MainTex);
 o.Normal = UnpackNormal(normal);
 
 float3 worldRefl = WorldReflectionVector (IN, o.Normal);
 float4 reflcol = texCUBE (_Cube, worldRefl);

 float4 lightMap = tex2D(_LightMap, IN.uv2_LightMap);
 
 o.Albedo = lightMap.rgb * diffuse.rgb * _LmIntensity;
 o.Emission = reflcol.rgb * (1 - normal.a) * _ReflectIntensity;
 o.Alpha = diffuse.a;
 
 }
 ENDCG
 }

 FallBack "Reflective/VertexLit"
}

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 24 июл 2012, 21:43
NOVA
Вот теперь принимает. Well Done. (3A4OT)

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 24 июл 2012, 22:45
NOVA
Однако глянец нормал мап стал хиленький.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 25 июл 2012, 08:50
MysTer92
Это естественно, раньше было диффуз и в альбедо, и в эмишн, поэтому ярче всё смотрелось, и глянец в том числе. А как с вариантом от Battle Angel Alita было?
Мб освещение тёмновато и эмбиент тоже?
Подкрутить переменную рефлекщн по-больше так же можно

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 25 июл 2012, 16:36
NOVA
MysTer92 писал(а):Это естественно, раньше было диффуз и в альбедо, и в эмишн, поэтому ярче всё смотрелось, и глянец в том числе. А как с вариантом от Battle Angel Alita было?
Мб освещение тёмновато и эмбиент тоже?

Я бы кинул свои скрины, но уже перенакрутил все настройки так, что всё попортил.
В том варианте не было освещения от реалтайм источников. Фиг бы уже с ним с рефлекшном. Хоть бы только в местах чёрной лайтмапы было чёрное, а в местах белой - белое. И номал со спекуляром работал. (Если бы у "пророка" был красный костюм в крайзисе, то при лунном свете он бы не был красным, зато нормал бамп отлично глянцевал бы при этом лунном свете а именно в местах потёртости краски металла). С тем шейдером уже почти получилось. Щас попробую помутить с 3 разными шейдерами может чо получится. Кстати похожий материал используется в dawn of war 2,
Скрытый текст:
Изображение


Я к тому что normalspecurlar блики не должны зависить от диффузы и лайтмапы.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 25 июл 2012, 19:34
NOVA
Почти Выпилил что хотел. В скрине на левой двери ворот. Да оно лучше рефлекшна. Рефлекшн можно пока убрать.

Скрытый текст:
Изображение


Скрытый текст:
Изображение


Только вот беда. Вследствие того, что я не знаю код, появляются жёлтые ошибки, значения которых я не понимаю:

Shader warning in 'Nova/RealLM/BumpedSpecular': Program 'frag_surf', Temporary register limit of 8 exceeded; 9 registers needed to compile program at line 29
Keywords: DIRECTIONAL, LIGHTMAP_ON, DIRLIGHTMAP_ON, SHADOWS_SCREEN (compiling for flash)

Shader warning in 'Nova/RealLM/BumpedSpecular': Not enough temporary registers, needs 9 (compiling for flash) at line 30

А также пропала прозрачность (текстура диффузы была полупрозрачная без альфы)

Шейдер:
Скрытый текст:
Shader "Nova/RealLM/BumpedSpecular"

{
Properties {



_SpecColor ("Specular Color", Color) = (0.5,0.5,0.5, 1)

_Shininess ("Shininess", Range (0.03, 1)) = 0.078125

_LmIntensity("Light map intensity", Range(0,1)) = 1

_MainTex ("Base (RGB)", 2D) = "white" {}

_NSMap ("Normal Spec map", 2D) = "bump" {}

_LightMap ("Lightmap (RGB)", 2D) = "black" {}

}



SubShader {

LOD 200

Tags { "RenderType" = "Opaque" }

CGPROGRAM

#pragma surface surf BlinnPhong

struct Input {

float2 uv_MainTex;

float2 uv_NSMap;

float2 uv2_LightMap;


};

sampler2D _MainTex;

sampler2D _LightMap;

sampler2D _NSMap;

float4 _Color;

float _Shininess;
float _LmIntensity;



void surf (Input IN, inout SurfaceOutput o)

{
float4 diffuse = tex2D(_MainTex, IN.uv_MainTex);
half4 tex = tex2D (_MainTex, IN.uv_MainTex);

half4 lm = tex2D (_LightMap, IN.uv2_LightMap);


o.Albedo = lm.rgb * diffuse.rgb * _LmIntensity ;
o.Emission = lm.rgb*o.Albedo.rgb;

o.Gloss = tex.a;

o.Alpha = lm.a * _Color.a;

o.Specular = _Shininess;

float4 normal = tex2D(_NSMap, IN.uv_MainTex);
o.Normal = UnpackNormal(normal);


}

ENDCG

}

FallBack "Legacy Shaders/Lightmapped/VertexLit"

}


Принцип работы тот же. Диффуза, нормалмапа со спекуляром в альфе. Только теперь в спекуляр белое - глянцует, чёрное не глянцует.

Re: Помогите допилить универсальный шейдер.

СообщениеДобавлено: 25 июл 2012, 21:27
NOVA
Балин. Свет на ровные поверхности опять не принимает(