[][src]Function directx_math::XMVector3Refract

pub fn XMVector3Refract(
    Incident: FXMVECTOR,
    Normal: FXMVECTOR,
    RefractionIndex: f32
) -> FXMVECTOR

Refracts an incident 3D vector across a 3D normal vector.

Parameters

Incident 3D incident vector to refract.

Normal 3D normal vector to refract the incident vector through.

RefractionIndex Index of refraction. See remarks.

Return value

Returns the refracted incident vector. If the refraction index and the angle between the incident vector and the normal are such that the result is a total internal reflection, the function will return a vector of the form < 0.0, 0.0, 0.0, undefined >.

Remarks

The following pseudocode demonstrates the operation of the function:

XMVECTOR Result;

float t = ( Incident.x * Normal.x + Incident.y * Normal.y + Incident.z * Normal.z );
float r = 1.0f - RefractionIndex * RefractionIndex * (1.0f - t * t);

if (r < 0.0f) // Total internal reflection
{
    Result.x = 0.0f;
    Result.y = 0.0f;
    Result.z = 0.0f;
}
else
{
    float s = RefractionIndex * t + sqrt(r);
    Result.x = RefractionIndex * Incident.x - s * Normal.x;
    Result.y = RefractionIndex * Incident.y - s * Normal.y;
    Result.z = RefractionIndex * Incident.z - s * Normal.z;
}

Result.w = undefined;

return Result;

The index of refraction is the ratio of the index of refraction of the medium containing the incident vector to the index of refraction of the medium being entered (where the index of refraction of a medium is itself the ratio of the speed of light in a vacuum to the speed of light in the medium).

Reference

https://docs.microsoft.com/en-us/windows/win32/api/directxmath/nf-directxmath-XMVector3Refract