Back to Home
Software Rendering Pipeline with Backface Culling

Software Rendering Pipeline with Backface Culling

B
Blizine Admin
·2 min read·0 views

yubin yang Posted on May 31 Software Rendering Pipeline with Backface Culling # python # graphics 1. Overview In this project, I implemented a simple software renderer using Python and Pygame. The renderer follows the fundamental stages of a 3D rendering pipeline. Local Space ↓ World Space ↓ View Space ↓ Clip Space ↓ Screen Space Enter fullscreen mode Exit fullscreen mode Model Transformation (Local Space → World Space) View Transformation (World Space → View Space) Perspective Projection (View Space → Clip Space) Viewport Transformation (Clip Space → Screen Space) Backface Culling Painter's Algorithm for depth sorting 2. Rendering Pipeline Implementation - The original code is too long, so I only posted the important parts. -Please check GitHub. Transforming World Space into View Space using the View Matrix def GetViewMatrix ( CamPos , TargetPos , Up ): ViewZ = TargetPos - CamPos ViewZ = ViewZ / np . linalg . norm ( ViewZ ) ViewX = np . cross ( Up , ViewZ ) ViewX = ViewX / np . linalg . norm ( ViewX ) ViewY = np . cross ( ViewZ , ViewX ) CamInv = np . array ([ [ ViewX [ 0 ], ViewX [ 1 ], ViewX [ 2 ], - np . dot ( ViewX , CamPos )], [ ViewY [ 0 ], ViewY [ 1 ], ViewY [ 2 ], - np . dot ( ViewY , CamPos )], [ ViewZ [ 0 ], ViewZ [ 1 ], ViewZ [ 2 ], - np . dot ( ViewZ , CamPos )], [ 0 , 0 , 0 , 1 ] ]) FlipY = np . array ([ [ - 1 , 0 , 0 , 0 ], [ 0 , 1 , 0 , 0 ], [ 0 , 0 , - 1 , 0 ], [ 0 , 0 , 0 , 1 ] ]) return np . matmul ( FlipY , CamInv ) Enter fullscreen mode Exit fullscreen mode GetViewMatrix() creates a View Matrix that transforms objects from World Space into View Space. The camera position, target position, and up vector are used to calculate the camera's local coordinate system. Once the View Matrix is applied, all objects are transformed into coordinates relative to the camera. Transforming View Space into Clip Space using the Projection Matrix def GetProjectionMatrix ( FovDeg , Width , Height , Near = 0.1 , Far = 1000 ): Fov = math . radians ( FovDeg ) Aspect =

📰Dev.to — dev.to

Comments