Я так понял это модель освещения для каких-то категорий сложных материалов (привет, Кэп).
В таком виде влазит только в 3.0.
Пока не знаю где брать значения A, B, rho_pi, и (как и в Velvet шейдере) что делать с источником света.
Синтаксис:
Используется glsl
Shader "Oren-Nayer Lighting (BRDF)" {
Properties
{
_LightColor("LightColor", Color) = (1,1,1,1)
_BumpMap ("Normalmap", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
struct Input {
float2 uv_MainTex;
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _LightColor;
void surf (Input IN, inout SurfaceOutput o)
{
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
//как нормально передать позицию источника света?
float3 LightDir = float3(0,1,1);
float nViewDir = normalize(IN.viewDir);
float3 HalfVect = normalize(LightDir+nViewDir);
// calculate all the dot products
float EdotH = dot(nViewDir, HalfVect);
float LdotH = dot(LightDir, HalfVect);
float NdotH = dot(o.Normal, HalfVect);
float NdotL = dot(o.Normal, LightDir);
float NdotE = dot(o.Normal, nViewDir);
// calculate the zenith angles
float sinTheta_r = length(cross(nViewDir,o.Normal));
float cosTheta_r = max(NdotE,0.001);
float sinTheta_i = length(cross(LightDir,o.Normal));
float cosTheta_i = max(NdotL,0.001);
float tanTheta_i = sinTheta_i / cosTheta_i;
float tanTheta_r = sinTheta_r / cosTheta_r;
// calculate the azimuth angles
float3 E_p = normalize(nViewDir-NdotE*o.Normal);
float3 L_p = normalize(LightDir-NdotL*o.Normal);
float cosAzimuth = dot(E_p, L_p);
//ок, а эти значения откуда брать? <img src="./images/smilies/3.gif" alt=";)" title="Хых" />
float A = 0.5;
float B = 0.5;
float rho_pi = 0.5;
// Compute final lighting
float inten = rho_pi * cosTheta_i * (A + B * max(0, cosAzimuth) * max(sinTheta_r, sinTheta_i) * min(tanTheta_i, tanTheta_r));
o.Albedo = _LightColor * clamp(inten,0.0,1);
}
ENDCG
}
Fallback "Diffuse"
}
Properties
{
_LightColor("LightColor", Color) = (1,1,1,1)
_BumpMap ("Normalmap", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
struct Input {
float2 uv_MainTex;
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _LightColor;
void surf (Input IN, inout SurfaceOutput o)
{
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
//как нормально передать позицию источника света?
float3 LightDir = float3(0,1,1);
float nViewDir = normalize(IN.viewDir);
float3 HalfVect = normalize(LightDir+nViewDir);
// calculate all the dot products
float EdotH = dot(nViewDir, HalfVect);
float LdotH = dot(LightDir, HalfVect);
float NdotH = dot(o.Normal, HalfVect);
float NdotL = dot(o.Normal, LightDir);
float NdotE = dot(o.Normal, nViewDir);
// calculate the zenith angles
float sinTheta_r = length(cross(nViewDir,o.Normal));
float cosTheta_r = max(NdotE,0.001);
float sinTheta_i = length(cross(LightDir,o.Normal));
float cosTheta_i = max(NdotL,0.001);
float tanTheta_i = sinTheta_i / cosTheta_i;
float tanTheta_r = sinTheta_r / cosTheta_r;
// calculate the azimuth angles
float3 E_p = normalize(nViewDir-NdotE*o.Normal);
float3 L_p = normalize(LightDir-NdotL*o.Normal);
float cosAzimuth = dot(E_p, L_p);
//ок, а эти значения откуда брать? <img src="./images/smilies/3.gif" alt=";)" title="Хых" />
float A = 0.5;
float B = 0.5;
float rho_pi = 0.5;
// Compute final lighting
float inten = rho_pi * cosTheta_i * (A + B * max(0, cosAzimuth) * max(sinTheta_r, sinTheta_i) * min(tanTheta_i, tanTheta_r));
o.Albedo = _LightColor * clamp(inten,0.0,1);
}
ENDCG
}
Fallback "Diffuse"
}