Ray-Tracing et Rasterizer Ray-Tracing et Rasterizer

Ray-Tracing et Rasterizer

J’ai saisi l’occasion du Grand Oral pour me pousser à coder ces deux programmes Python. Les deux programmes n’utilisent que Numpy pour les arrays et les calculs vectoriels et Matplotlib pour transformer les arrays en png.

Raytracing

Ce ray tracing simple en python que j’ai fait en m’inspirant de l’article Medium : “Ray tracing from scratch in python”.

Résultat ray tracing animation

Voici les fonctionnalités du ray-tracer :

  • Rendre des images avec perspective ou isométrique
  • Rendre des depth -map
  • Matériaux différents (diffuse, indice de réflexion…)
  • Supporte autant de lumière que voulu
  • Reflets récursifs avec profondeur choisie
  • FOV dynamique
  • Pour le moment, ne peut que faire le ray tracing avec des sphères.
  • Version parallèle du renderer pour gagner en vitesse (image 4 k de profondeur 6 avec 2 lumières en généré 2 min sur ma machine)

Résultat ray tracing 4 k

J’ai aussi mis à disposition le code original de l’article dans le dépot.

Futur

Je prévois d’étendre le ray tracing cet été :

  • Support de plus d’objets (plan, triangle)
  • Caméra non fixe
  • Peut-être support de texture

Rasterizer

J’ai fait le rasterizer en m’inspirant du livre “Computer Graphics from Scratch” de Gabriel Gambetta, accessible gratuitement en ligne pour le dessin des triangles et la projection et est fait le reste par moi-même avec mes connaissances.

Le rasterizer utilise un pipeline de rendu différé (deferred rendering) en trois passes :

  1. Passe géométrique — les triangles sont rastérisés dans un G-buffer qui stocke par pixel la normale, la profondeur, les coordonnées UV et l’identifiant du matériau.
  2. Passe d’éclairage — chaque pixel lit son matériau depuis le G-buffer et calcule la couleur finale.
  3. Post-traitement — des effets plein écran comme le brouillard sont appliqués sur l’image finale.

Voici les fonctionnalités du rasterizer :

  • Dessiner des triangles ou des lignes sur un plan.
  • Projeter des points de l’espace sur un plan avec correction de perspective.
  • Culling des triangles hors de vue ou pas face à la caméra.
  • Rendre une image wireframe ou avec les triangles pleins d’un espace 3D.
  • Interpolation des normales par sommet pour un ombrage lisse (smooth shading) ou non (activé avec un paramètre lors de l’importation de l’objet.
  • Coordonnées UV perspective-correctes pour le placage de textures.
  • Système de matériaux extensible avec différents modes de fusion (opaque, alpha, additif, multiplicatif) encore en WIP pour l’alpha:
  • Matériaux pré-construit:
    • Unlit material et unlit texture
    • Lit material et lit texture (formule de Blinn-Phong)
    • Post-process: fog
  • Chargement de modèles 3D au format OBJ avec support des normales et coordonnées UV.
  • G-buffer exposant les normales, la profondeur et les UV pour les matériaux et post process.
  • Correction gamma.

Rasterizer

Rendu de cette image (2000x2000px, deux lumières, 66.8k triangles) en 51s.

Actuellement en développement

Je suis actuellement en train de changer la methode de dessin des triangles : je passe d’un scanline walker au barycentric edge function pour empécher l’apparition d’espaces entre deux triangles collés et pour permettre la parralélisation plus tard.

Futur

  • Ombres par shadow maps
  • Plusieurs types de lumières (directionnelles, spot)
  • Support de la transparence
  • Rendu isométrique
  • Support de la rotation de caméra
  • Accélération par tuiles pour le rendu parallèle
  • Culling d’instances