Первый мой шейдер был с использованием сурфейсной техники юнити, как оказалось я пока не до конца понимаю как она генерит шейдеры и блики там сделать вообще не получилось.
Сейчас шейдер переписал заново вот так:
Shader "Divan/DiffuseSpecularNew" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
_Shininess ("Shininess", Range (0.01, 1)) = 0.8
_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
_LightMap ("Lightmap (RGB)", 2D) = "white" {}
_LightMap2 ("Lightmap2 (RGB)", 2D) = "white" {}
_LightMapT ("LightmapT", Range (0.0, 1)) = 0.0
}
SubShader {
LOD 200
Tags { "RenderType" = "Opaque" }
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _LightMap;
sampler2D _LightMap2;
float4 _Color;
float4 _SpecColor;
float _LightMapT;
float _Shininess;
float4x4 _MainTexMatrix;
struct appdata
{
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
float4 texcoord1: TEXCOORD1;
float4 normal : NORMAL;
};
struct v2f {
float4 pos : POSITION;
float4 uv : TEXCOORD0;
float4 uv2 : TEXCOORD1;
float4 normal : TEXCOORD2;
float3 lightDir : TEXCOORD3;
float3 viewDir : TEXCOORD4;
};
v2f vert (appdata v)
{
v2f o;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = mul(_MainTexMatrix, v.texcoord);
o.uv2 = v.texcoord1;
o.normal = v.normal;
o.lightDir = ObjSpaceLightDir( v.vertex );
o.viewDir = ObjSpaceViewDir( v.vertex );
return o;
}
half4 frag( v2f i ) : COLOR {
half4 mainColor = tex2D(_MainTex, i.uv.xy);
half4 c = ((1 - _LightMapT) * tex2D (_LightMap, i.uv2.xy) + _LightMapT * tex2D (_LightMap2, i.uv2.xy) ) * mainColor;
half3 h = normalize (i.lightDir + i.viewDir);
float nh = max (0, dot (i.normal, h));
float spec = pow (nh, mainColor.a * 48) * _Shininess;
return c * _Color + spec * _SpecColor;
}
ENDCG
}
}
FallBack "Divan/VertexLit"
}
UPD: такое чувство, что шейдер считает положение камеры и источника в одном месте, и источник точечный... хотя должен быть направленный...