-
Notifications
You must be signed in to change notification settings - Fork 0
/
DiffSpecMaterial.cpp
38 lines (35 loc) · 1.29 KB
/
DiffSpecMaterial.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "DiffSpecMaterial.h"
ColorRGB DiffSpecMaterial::ambientResponse(const ONB& uvw, const Vector3D& v_in, const Vector3D& p, const Vector2D& uv)
{
float cosine = dotProduct(v_in, uvw.w());
if (cosine < 0.0f) cosine = -cosine;
float temp1 = 1.0f - cosine;
float R = R0 + (1.0f - R0) *temp1*temp1*temp1*temp1*temp1;
float P = (R + 0.5f) / 2.0f;
if(rng() <= P)
return spec_mat->ambientResponse(uvw, v_in, p, uv);
else
return diff_mat->ambientResponse(uvw, v_in, p, uv);
}
bool DiffSpecMaterial::explicitBrdf(const ONB& uvw, const Vector3D& v0, const Vector3D& v1, const Vector3D& p,
const Vector2D& uv, ColorRGB& brdf)
{return diff_mat->explicitBrdf(uvw, v0, v1, p, uv, brdf);}
bool DiffSpecMaterial::scatterDirection(const Vector3D& v_in, const HitRecord & rec, Vector2D& seed, ColorRGB& color, bool& CEL,
float& brdf, Vector3D& v_out)
{
float cosine = dotProduct(v_in, rec.uvw.w());
if (cosine <0.0f) cosine = -cosine;
float temp1 = 1.0f - cosine;
float R = R0 + (1.0f - R0) *temp1*temp1*temp1*temp1*temp1;
float P = (R + 0.5f) / 2.0f;
if(rng() <= P)
{
brdf = R/P;
return spec_mat->scatterDirection(v_in, rec, seed, color, CEL, temp1, v_out);
}
else
{
brdf = (1.0f - R)/ (1.0f- P);
return diff_mat->scatterDirection(v_in, rec, seed, color, CEL, temp1, v_out);
}
}