Подсмотрен здесь:
http://wiki.gamedev.net/index.php/D3DBo ... _Rendering
Надо будет потом реализовать оставшиеся интересные вещи оттуда.
Синтаксис:
Используется glsl
Shader "Night Tonemapping aka Blue Shift" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Night("Night", Range(0.0,1.0)) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float _Night;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
//конвертим цветовое пространство RGB в цветовое пространство XYZ
float X = dot(c.rgb,float3(0.4124, 0.3576, 0.1805));
float Y = dot(c.rgb,float3(0.2126, 0.7152, 0.0722));
float Z = dot(c.rgb,float3(0.0193, 0.1192, 0.9505));
//считаем scotopic luminance
float V = Y*(1.33*(1+(Y+Z)/X) -1.68);
//tint the scotopic luminance V with a blue shift
float nRed = V*1.05;
float nBlue = V*0.97;
float nGreen = V*1.27;
c.rgb = lerp(c.rgb, half3(nRed,nGreen,nBlue), _Night);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Night("Night", Range(0.0,1.0)) = 0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float _Night;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
//конвертим цветовое пространство RGB в цветовое пространство XYZ
float X = dot(c.rgb,float3(0.4124, 0.3576, 0.1805));
float Y = dot(c.rgb,float3(0.2126, 0.7152, 0.0722));
float Z = dot(c.rgb,float3(0.0193, 0.1192, 0.9505));
//считаем scotopic luminance
float V = Y*(1.33*(1+(Y+Z)/X) -1.68);
//tint the scotopic luminance V with a blue shift
float nRed = V*1.05;
float nBlue = V*0.97;
float nGreen = V*1.27;
c.rgb = lerp(c.rgb, half3(nRed,nGreen,nBlue), _Night);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}