33 #ifndef __BSDF_UTIL_H__
34 #define __BSDF_UTIL_H__
72 *
R = (2 *
cos) * Nn -
I;
73 #ifdef __RAY_DIFFERENTIALS__
74 *dRdx = (2 *
dot(Nn, dIdx)) * Nn - dIdx;
75 *dRdy = (2 *
dot(Nn, dIdy)) * Nn - dIdy;
78 float arg = 1 - (neta * neta * (1 - (
cos *
cos)));
81 #ifdef __RAY_DIFFERENTIALS__
89 float nK = (neta *
cos) - dnp;
90 *
T = -(neta *
I) + (nK * Nn);
91 #ifdef __RAY_DIFFERENTIALS__
92 *dTdx = -(neta * dIdx) + ((neta - neta * neta *
cos / dnp) *
dot(dIdx, Nn)) * Nn;
93 *dTdy = -(neta * dIdy) + ((neta - neta * neta *
cos / dnp) *
dot(dIdy, Nn)) * Nn;
96 float cosTheta1 =
cos;
97 float cosTheta2 = -
dot(Nn, *
T);
98 float pPara = (cosTheta1 - eta * cosTheta2) / (cosTheta1 + eta * cosTheta2);
99 float pPerp = (eta * cosTheta1 - cosTheta2) / (eta * cosTheta1 + cosTheta2);
100 return 0.5f * (pPara * pPara + pPerp * pPerp);
109 float g = eta * eta - 1 +
c *
c;
112 float A = (g -
c) / (g +
c);
113 float B = (
c * (g +
c) - 1) / (
c * (g -
c) + 1);
114 return 0.5f *
A *
A * (1 +
B *
B);
123 float3 tmp_f = eta * eta + k * k;
124 float3 tmp = tmp_f * cosi2;
125 float3 Rparl2 = (tmp - (2.0f * eta * cosi) + one) / (tmp + (2.0f * eta * cosi) + one);
126 float3 Rperp2 = (tmp_f - (2.0f * eta * cosi) + cosi2) / (tmp_f + (2.0f * eta * cosi) + cosi2);
127 return (Rparl2 + Rperp2) * 0.5f;
132 float m =
clamp(1.0f - u, 0.0f, 1.0f);
145 float F0_norm = 1.0f / (1.0f - F0);
ccl_device float fresnel_dielectric_cos(float cosi, float eta)
CCL_NAMESPACE_BEGIN ccl_device float fresnel_dielectric(float eta, const float3 N, const float3 I, float3 *R, float3 *T, bool *is_inside)
ccl_device_forceinline float3 interpolate_fresnel_color(float3 L, float3 H, float ior, float F0, float3 cspec0)
ccl_device float schlick_fresnel(float u)
ccl_device float3 fresnel_conductor(float cosi, const float3 eta, const float3 k)
static bool is_inside(int x, int y, int cols, int rows)
#define ccl_device_forceinline
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
#define __RAY_DIFFERENTIALS__
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
ccl_device_inline int clamp(int a, int mn, int mx)
ccl_device_inline float dot(const float2 &a, const float2 &b)