Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/closure/bsdf_util.h
| Show All 29 Lines | |||||
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | */ | ||||
| #ifndef __BSDF_UTIL_H__ | #ifndef __BSDF_UTIL_H__ | ||||
| #define __BSDF_UTIL_H__ | #define __BSDF_UTIL_H__ | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| ccl_device bool refract_dielectric( | |||||
| float eta, const float3 N, const float3 I, | |||||
| #ifdef __RAY_DIFFERENTIALS__ | |||||
| const float3 dIdx, const float3 dIdy, | |||||
| float3 *dTdx, float3 *dTdy, | |||||
| #endif | |||||
| float3 *T) | |||||
| { | |||||
| float cosNI = dot(N, I); | |||||
| if(cosNI <= 0.0f) { | |||||
| return false; | |||||
| } | |||||
| float neta = 1.0f / eta; | |||||
| float arg = 1.0f - (sqr(neta) * (1.0f - sqr(cosNI))); | |||||
| if(arg <= 0) { | |||||
| return false; | |||||
| } | |||||
| float dnp = max(sqrtf(arg), 1e-7f); | |||||
| float nK = (neta * cosNI) - dnp; | |||||
| *T = (nK * N) - (neta * I); | |||||
| #ifdef __RAY_DIFFERENTIALS__ | |||||
| float fac = neta * (1.0f - neta * cosNI / dnp); | |||||
| *dTdx = (fac * dot(dIdx, N)) * N - neta * dIdx; | |||||
| *dTdy = (fac * dot(dIdy, N)) * N - neta * dIdy; | |||||
| #endif | |||||
| return true; | |||||
| } | |||||
| ccl_device float fresnel_dielectric( | ccl_device float fresnel_dielectric( | ||||
| float eta, const float3 N, | float eta, const float3 N, | ||||
| const float3 I, float3 *R, float3 *T, | const float3 I, float3 *R, float3 *T, | ||||
| #ifdef __RAY_DIFFERENTIALS__ | #ifdef __RAY_DIFFERENTIALS__ | ||||
| const float3 dIdx, const float3 dIdy, | const float3 dIdx, const float3 dIdy, | ||||
| float3 *dRdx, float3 *dRdy, | float3 *dRdx, float3 *dRdy, | ||||
| float3 *dTdx, float3 *dTdy, | float3 *dTdx, float3 *dTdy, | ||||
| #endif | #endif | ||||
| ▲ Show 20 Lines • Show All 116 Lines • Show Last 20 Lines | |||||