Oren-Nayer Lighting (BRDF) [todo: доработать]

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

Oren-Nayer Lighting (BRDF) [todo: доработать]

Сообщение gnoblin 22 окт 2010, 07:45

Про эту хитрую штуку я еще не успел прочитать).
Я так понял это модель освещения для каких-то категорий сложных материалов (привет, Кэп).
В таком виде влазит только в 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"
   
  }
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Oren-Nayer Lighting (BRDF) [todo: доработать]

Сообщение gnoblin 22 окт 2010, 08:02

Табличку с коэффициентами нашел.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


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

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

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