perspective_LH_M11

Build a perspective projection matrix with left-hand NDC and [-1 .. 1] depth clipping

pure @safe @nogc nothrow
perspective_LH_M11
(
T
)
(
in T fovx
,
in T aspect
,
in T near
,
in T far
)
if (
isFloatingPoint!T
)

Parameters

fovx T

horizontal field of view in degrees

aspect T

aspect ratio (width / height)

near T

position of the near plane

far T

position of the far plane

Return Value

Type: Mat4!T

a matrix that maps from eye space to clip space. To obtain NDC, the vector must be divided by w.

Examples

const m = perspective_LH_M11!float(90, 2, 2, 4);
const vl = fvec(-2, -1, -2);
const vh = fvec(4, 2, -4);
const vc = fvec(0, 0, -3);

auto toNdc(in FVec3 v) {
    const clip = m * fvec(v, 1);
    return (clip / clip.w).xyz;
}

import gfx.math.approx : approxUlp;
assert(approxUlp( toNdc(vl), fvec(-1, -1, -1) ));
assert(approxUlp( toNdc(vh), fvec(1, 1, 1) ));
assert(approxUlp( toNdc(vc), fvec(0, 0, 1f/3f) ));

Meta