Replaces all usage by the the gpu_shader_math equivalent. This is because the old shader library was quite tangled. This avoids dependency hell trying to mix libraries. Changes are split into isolated commits until I had to do mass changes because of inter- dependencies. Pull Request: https://projects.blender.org/blender/blender/pulls/113631
41 lines
1.0 KiB
GLSL
41 lines
1.0 KiB
GLSL
/* SPDX-FileCopyrightText: 2019-2022 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
float fresnel_dielectric_cos(float cosi, float eta)
|
|
{
|
|
/* compute fresnel reflectance without explicitly computing
|
|
* the refracted direction */
|
|
float c = abs(cosi);
|
|
float g = eta * eta - 1.0 + c * c;
|
|
float result;
|
|
|
|
if (g > 0.0) {
|
|
g = sqrt(g);
|
|
float A = (g - c) / (g + c);
|
|
float B = (c * (g + c) - 1.0) / (c * (g - c) + 1.0);
|
|
result = 0.5 * A * A * (1.0 + B * B);
|
|
}
|
|
else {
|
|
result = 1.0; /* TIR (no refracted component) */
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
float fresnel_dielectric(vec3 Incoming, vec3 Normal, float eta)
|
|
{
|
|
/* compute fresnel reflectance without explicitly computing
|
|
* the refracted direction */
|
|
return fresnel_dielectric_cos(dot(Incoming, Normal), eta);
|
|
}
|
|
|
|
void node_fresnel(float ior, vec3 N, out float result)
|
|
{
|
|
N = normalize(N);
|
|
vec3 V = coordinate_incoming(g_data.P);
|
|
|
|
float eta = max(ior, 0.00001);
|
|
result = fresnel_dielectric(V, N, (FrontFacing) ? eta : 1.0 / eta);
|
|
}
|