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

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

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

Сообщение NOVA 22 июл 2012, 15:02

Универсальный для неорганических объектов. 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"

}
Последний раз редактировалось NOVA 30 июл 2012, 19:35, всего редактировалось 2 раз(а).
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение Woolf 22 июл 2012, 17:19

Не помогу, лень, вот только reflective вам зачем о_О? Это, как-бы, совсем не универсальная вещь.. С остальным согласен, сам такой шейдер (тока без лайтмапы) делал.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

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

Сообщение NOVA 22 июл 2012, 21:12

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

Удаляем вот это: * _ReflectIntensity и всё.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение Battle Angel Alita 23 июл 2012, 12:10

Синтаксис:
Используется glsl
//o.Albedo = diffuse.rgb;
..
o.Emission = lightMap.rgb * diffuse.rgb * _LmIntensity + reflcol.rgb * (1 - normal.a) * _ReflectIntensity;

как то так
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение NOVA 23 июл 2012, 16:35

Спасибки). Выглядит вроде как надо, только вот свет теперь от реальных источников не принимает((
Последний раз редактировалось NOVA 23 июл 2012, 18:54, всего редактировалось 1 раз.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение MysTer92 23 июл 2012, 17:28

Может лучше так? Вроде как альбедо для диффуза и освещения, а эмишн для самосвечения и отражений.
Синтаксис:
Используется glsl
o.Albedo = lightMap.rgb * diffuse.rgb * _LmIntensity;
...
o.Emission = reflcol.rgb * (1 - normal.a) * _ReflectIntensity;
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ

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

Сообщение NOVA 23 июл 2012, 19:11

Material doesn't have a texture property '_LightMap'
UnityEditor.DockArea:OnGUI()
Где-то 5 сообщений по всем картам. Всё розового цвета.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение MysTer92 24 июл 2012, 16:59

Нужно было переменную лайтмап объявить выше, до альбедо, вместе с фетчем текстуры. Проглядел.
Вот так в общем:
Синтаксис:
Используется 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"
}
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ

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

Сообщение NOVA 24 июл 2012, 21:43

Вот теперь принимает. Well Done. (3A4OT)
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение NOVA 24 июл 2012, 22:45

Однако глянец нормал мап стал хиленький.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение MysTer92 25 июл 2012, 08:50

Это естественно, раньше было диффуз и в альбедо, и в эмишн, поэтому ярче всё смотрелось, и глянец в том числе. А как с вариантом от Battle Angel Alita было?
Мб освещение тёмновато и эмбиент тоже?
Подкрутить переменную рефлекщн по-больше так же можно
Asset Store: Graphic Power-Up
about me
MysTer92
UNIт
 
Сообщения: 97
Зарегистрирован: 03 дек 2009, 09:08
Откуда: Кемерово
  • Сайт
  • ICQ

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

Сообщение NOVA 25 июл 2012, 16:36

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

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


Я к тому что normalspecurlar блики не должны зависить от диффузы и лайтмапы.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение NOVA 25 июл 2012, 19:34

Почти Выпилил что хотел. В скрине на левой двери ворот. Да оно лучше рефлекшна. Рефлекшн можно пока убрать.

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


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


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

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"

}


Принцип работы тот же. Диффуза, нормалмапа со спекуляром в альфе. Только теперь в спекуляр белое - глянцует, чёрное не глянцует.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

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

Сообщение NOVA 25 июл 2012, 21:27

Балин. Свет на ровные поверхности опять не принимает(
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia


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

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

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