Advertisement
matejnevlud

Phong + Freshnel

Dec 13th, 2020
532
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. // PHONG EXPLICIT DIFF OR SPEC SHLICK FRESNEL
  2.     else if (hit_material->shader == 9) {
  3.  
  4.         float gamma = hit_material->shininess;
  5.         Vector3 omega_i, omega_r;
  6.        
  7.         if(hit_material->diffuse.ToColor3f().AsLinear() + hit_material->specular.ToColor3f().AsLinear() > 1) return Color3f{0, 0, 0};
  8.  
  9.         // BEGIN IMPORTANCE SAMPLING
  10.         bool sample_diffuse;
  11.         float random0 = rng.uniformThread() * (hit_material->diffuse.MaxComponent() + hit_material->specular.MaxComponent());
  12.         if( random0 < hit_material->diffuse.MaxComponent())
  13.             sample_diffuse = true;
  14.         else
  15.             sample_diffuse = false;
  16.         // END IMPORTANCE SAMPLING
  17.  
  18.         if(sample_diffuse) {
  19.             omega_i = CosineWeightedSampling(normal, pdf);
  20.  
  21.             RTCRay rayIncident = PrepareRay(hit_position, omega_i);
  22.             Color3f L_i = TraceRay(rayIncident, reflectCount + 1, n1, isFromAir);
  23.  
  24.             float cosTheta_o = omega_o.DotProduct(normal);
  25.             float cosTheta_i = omega_i.DotProduct(normal);
  26.             float cosTheta_r = omega_i.DotProduct(omega_r);
  27.             float raisedCosTheta_r = pow(cosTheta_r, gamma);
  28.  
  29.             // SPECULAR REFLECTANCE
  30.             Color3f ps = hit_material->specular.ToColor3f().AsLinear();
  31.             Color3f F = Fresnel(ps, cosTheta_o);
  32.  
  33.             // DIFFUSE REFLECTANCE
  34.             Color3f pd = hit_material->diffuse.ToColor3f().AsLinear();
  35.             Color3f R_d = pd * (1.0f - F.MaxComponent()) / (1.0f - ps.MaxComponent());
  36.             Color3f kd = R_d * M_1_PI;
  37.  
  38.             Color3f f_r = kd;
  39.             Color3f L_r_indir = L_i * f_r * cosTheta_i / (pdf * alpha);
  40.  
  41.             if (isnan(L_r_indir.r) || isnan(L_r_indir.g) || isnan(L_r_indir.b)){
  42.                 printf("OPSIE: L_i * f_r * %.3f / (%.3f * %.3f)\n", cosTheta_i, pdf, alpha);
  43.                 printf("L_i: (%.3f, %.3f, %.3f)\n", L_i.r, L_i.g, L_i.b);
  44.                 printf("f_r: (%.3f, %.3f, %.3f)\n", f_r.r, f_r.g, f_r.b);
  45.                 return Color3f{ 0.0, 0.0, 0.0};
  46.             }
  47.  
  48.             return L_r_indir + L_e * f_r;
  49.         } else {
  50.             omega_r = ReflectVector(omega_o, normal);
  51.             omega_i = CosineLobeSampling(omega_r, pdf, gamma);
  52.             RTCRay rayIncident = PrepareRay(hit_position, omega_i);
  53.             Color3f L_i = TraceRay(rayIncident, reflectCount + 1, n1, isFromAir);
  54.  
  55.             float cosTheta_o = omega_o.DotProduct(normal);
  56.             float cosTheta_i = omega_i.DotProduct(normal);
  57.             float cosTheta_r = omega_i.DotProduct(omega_r);
  58.             float raisedCosTheta_r = pow(cosTheta_r, gamma);
  59.  
  60.             // ENERGY CONSERVING
  61.             float I_M_1 = (gamma + 2.0f) * 0.5f * M_1_PI;
  62.             float I_M = (gamma + 2.0f) / 2.0f * M_PI;
  63.             //float I_M_1_calc = 1 / calc_I_M(normal.DotProduct(-omega_o), gamma);
  64.  
  65.             // SPECULAR REFLECTANCE
  66.             Color3f ps = hit_material->specular.ToColor3f().AsLinear();
  67.             Color3f F = Fresnel(ps, cosTheta_o);
  68.             Color3f ks = F * raisedCosTheta_r * I_M_1 / cosTheta_i;
  69.  
  70.             Color3f f_r = ks;
  71.             Color3f L_r_indir = L_i * f_r * cosTheta_i / (pdf * alpha);
  72.  
  73.             if (isnan(L_r_indir.r) || isnan(L_r_indir.g) || isnan(L_r_indir.b)){
  74.                 printf("OPSIE: L_i * f_r * %.3f / (%.3f * %.3f)\n", cosTheta_i, pdf, alpha);
  75.                 printf("L_i: (%.3f, %.3f, %.3f)\n", L_i.r, L_i.g, L_i.b);
  76.                 printf("f_r: (%.3f, %.3f, %.3f)\n", f_r.r, f_r.g, f_r.b);
  77.                 return Color3f{ 0.0, 0.0, 0.0};
  78.             }
  79.  
  80.             return L_r_indir + L_e * f_r;
  81.         }
  82.  
  83.        
  84.        
  85.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement