| # Impeller's Coordinate System |
| |
| **TL;DR, Impeller uses the Metal coordinate system.** |
| |
| This document describes the Impeller coordinate system. This is the coordinate |
| system assumed by all Impeller sub-subsystems and users of Impeller itself. |
| |
| All sub-systems that deal with interacting with backend client rendering APIs |
| (like OpenGL, Metal, Direct3D, Dawn, etc..) must reconcile with Impellers |
| coordinate system. |
| |
| While the readers familiarity with a particular coordinate system might make |
| them think otherwise, there is no right or wrong coordinate system. However, |
| having a consist notion of a coordinate system is essential. Since the Metal |
| backend was the first Impeller backend, the Metal coordinate system was picked |
| as the Impeller coordinate system with very little consideration of |
| alternatives. |
| |
| The following table describes the Impeller coordinate system along with how it |
| differs with that of popular client rendering APIs and backends. |
| |
| | API | Normalized Device Coordinate | Viewport / Framebuffer Coordinate | Texture Coordinate | |
| |---------------|-------------------------------------------------------|---------------------------------------|--------------------------------------| |
| | **Impeller** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Top-Left Origin, `+Y` down. | `(0,0)` Top-Left Origin, `+Y` down. | |
| | **Metal** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Top-Left Origin, `+Y` down. | `(0,0)` Top-Left Origin, `+Y` down. | |
| | **OpenGL** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | |
| | **OpenGL ES** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | |
| | **WebGL** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | `(0,0)` Bottom-Left Origin, `+Y` up. | |
| | **Direct 3D** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Top-Left Origin, `+Y` down. | `(0,0)` Top-Left Origin, `+Y` down. | |
| | **Vulkan** | `(-1,-1)` Top-Left, `(+1,+1)` Bottom-Right, `+Y` down.| `(0,0)` Top-Left Origin, `+Y` down. | `(0,0)` Top-Left Origin, `+Y` down. | |
| | **WebGPU** | `(-1,-1)` Bottom-Left, `(+1,+1)` Top-Right, `+Y` up. | `(0,0)` Top-Left Origin, `+Y` down. | `(0,0)` Top-Left Origin, `+Y` down. | |