refract

For the incident vector I and surface normal N, and the ratio of indices of refraction eta, return the refraction vector The input parameters for the incident vector I and the surface normal N must already be normalized

pure nothrow @nogc @safe
V.valueType
refract
(
V
)
(
V I
,
V N
,
V.valueType eta
)

Examples

Unittest Geometric functions TODO : add tests for faceforward, reflect and refract

// dot
vec2 v2 = vec2( 1.0f,  3.0f );
assert( dot( v2, vec2( 2.0f, 2.0f )) == 8.0f );

vec3 v3 = vec3( 1.0f,  3.0f, 5.0f );
assert( dot( v3, vec3( 2.0f, 2.0f, 2.0f )) == 18.0f );

vec4 v4 = vec4( 1.0f,  3.0f, 5.0f, 7.0f );
assert( dot( v4, vec4( 2.0f, 2.0f, 2.0f, 2.0f )) == 32.0f );

vec3 v3_1 = vec3( 1.0f, 2.0f, -3.0f );
vec3 v3_2 = vec3( 1.0f, 3.0f,  2.0f );

assert( dot( v3_1, v3_2 ) == 1.0f );
assert( dot( v3_1, v3_2 ) == dot( v3_2, v3_1 ));
assert( v3_1 * v3_2 == v3_1 * v3_2 );
assert( v3_1 * v3_2 == vec3( 1.0f, 6.0f, -6.0f ));

// cross
assert( cross( v3_1, v3_2 ).data == [ 13.0f, -5.0f, 1.0f ] );
assert( cross( v3_2, v3_1 ).data == [ -13.0f, 5.0f, -1.0f ] );

// normalize
assert( normalize( vec2( 1 )) == [ 1.0f / sqrt( 2.0f ), 1.0f / sqrt( 2.0f ) ] );
assert( vec3( 1 ).normalize   == [ 1.0f / sqrt( 3.0f ), 1.0f / sqrt( 3.0f ), 1.0f / sqrt( 3.0f ) ] );
assert( normalize( vec4( 1 )) == [ 0.5, 0.5, 0.5, 0.5 ] );

// length
assert( length( v2 ) == sqrt( 10.0f ));
assert( v3.length    == sqrt( 35.0f ));
assert( length( v4 ) == sqrt( 84.0f ));

// distance
assert( distance( vec2( 0.0f, 0.0f ), vec2( 0.0f, 10.0f )) == 10.0 );

Meta