Skip to content

Improve projection matrix constructors #569

@kovaxis

Description

@kovaxis

Hello! I got very confused choosing the proper Mat4::perspective_* function. I think they could be documented a lot better. In particular, listing from what coordinate system they are mapping from, and into what coordinate system they are mapping into.

I've now done the research, and the transformations are:

perspective_rh_gl: X+ right, Y+ up, Z+ out of screen -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [-1, 1]
perspective_rh:    X+ right, Y+ up, Z+ out of screen -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [0, 1]
perspective_lh:    X+ right, Y+ up, Z+ into screen   -> X+ right [-1, 1], Y+ up [-1, 1], Z+ into screen [0, 1]

Where OpenGL uses Z+ into screen [-1, 1], Metal/DirectX/WebGPU use Z+ into screen [0, 1] and Vulkan uses Y+ down, Z+ into screen [0, 1].

The same issue applies to orthographic projections.

I propose the following to avoid breaking changes:

  • Add perspective_rh_vk and orthographic_rh_vk functions, that map from X+ right, Y+ up, Z+ out of screen to Y+ down, Z+ into screen [0, 1] (what Vulkan expects).
  • Document all of the projection functions with their corresponding modelview-coordinate-system -> graphics-api pairs.
    • perspective_rh_gl: Z+ out of screen -> GL
    • perspective_rh_vk: Z+ out of screen -> VK
    • perspective_rh: Z+ out of screen -> Metal/DX/WGPU
    • perspective_lh: Z+ into screen -> Metal/DX/WGPU
    • Corresponding orthographic functions.
  • Further document the perspective_infinite and perspective_infinite_reverse.

There would be no Z+ into screen -> VK, just like currently there is no Z+ into screen -> GL. Maybe those two could be added? (perspective_lh_gl, perspective_lh_vk).

Actually, I collected my thoughts while writing this issue and I think I'll write up a PR.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions