Mouse Input Basics

SDL Coordinate System: Why Y-Down?

Why does SDL use a y-down coordinate system instead of y-up?

Abstract art representing computer programming

The convention of using a "y-down" coordinate system, where the origin (0,0) is at the top-left and the y-value increases downwards, is common in computer graphics, particularly for 2D rendering and windowing systems. SDL follows this convention.

Historical Reasons

This practice dates back to early computing and television technology:

  • Raster Scanning: Televisions and early computer monitors draw images using a raster scan, starting from the top-left corner and scanning horizontally line by line, moving downwards. Aligning the coordinate system origin with the start of this scanning process was a natural fit.
  • Framebuffers: Graphics memory (the framebuffer) is often organized linearly. The pixel data for the first row of the display appears first in memory, followed by the second row, and so on. Mapping memory address increments directly to increasing y-coordinates (moving down the screen) simplified graphics hardware and software design.

Consistency with Windowing Systems

Most operating system windowing APIs (like Windows GDI, macOS Quartz, X11) also use a top-left origin for window coordinates. SDL, aiming for cross-platform consistency and integration with these systems, adopts the same convention. This makes it easier to translate coordinates between SDL surfaces/windows and the underlying OS graphics context.

Practicality for 2D

For many 2D graphics tasks, like rendering UI elements, sprites, or tilemaps, working from the top-left often feels intuitive. Layouts are typically defined relative to the top and left edges of containers or the screen.

Contrast with Mathematical Conventions

The y-up system, where y increases upwards, is standard in mathematics (e.g., Cartesian coordinates) and often used in 3D graphics APIs (like OpenGL's normalized device coordinates, though projection matrices often flip the y-axis to match the y-down framebuffer).

Handling the Difference

While SDL uses y-down for window coordinates, mouse events, and surface rendering, you can always perform mathematical conversions if a y-up system is more natural for specific calculations (like physics simulations). This typically involves subtracting the y-coordinate from the height of the relevant area (window or world space).

int windowHeight = GameWindow.GetHeight();
int y_up_coordinate = windowHeight - event.motion.y;

We delve deeper into coordinate systems, transformations, and managing different spaces (world space, screen space) later in the course, particularly when we introduce cameras and rendering scenes.

Answers to questions are automatically generated and may not have been reviewed.

sdl2-promo.jpg
Part of the course:

Game Dev with SDL2

Learn C++ and SDL development by creating hands on, practical projects inspired by classic retro games

This course includes:

  • 110 Lessons
  • 92% Positive Reviews
  • Regularly Updated
  • Help and FAQs
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2025 - All Rights Reserved