Want to create interactive content? It’s easy in Genially!

Get started free

Ugolini's Project

SIMONE UGOLINI

Created on September 7, 2023

Start designing with a free template

Discover more than 1500 professional designs like these:

Transcript

UGOLINI'S PROjecT

Intro
Simone Ugolini

Le idee

Motore grafico
Intelligenza artificiale
Sistema operativo
+ Avevo già esperienza
- Non ne sapevo molto
- Troppo grande
+ Fattibile
+ Fattibile
- Assembly

COS'È UN MOTORE GRAFICO

Software che esegue operazioni matematiche per rototraslare oggetti 3D e mostrarne il risultato in tempo reale
Blender
Blender
TRASFORMAZIONI E PROIEZIONI
DA SPAZIO ASSOLUTO A RELATIVO
I triangoli sono inizialmente descritti in uno spazio chiamato assoluto, queste devono essere poi transformate in spazio relativo alla camera (relToCam). Infine, le coordinate, ancora 3D, devono essere convertite in 2D (screen space), questo viene fatto grazie ad un processo chiamato proiezione.
DA TRIANGOLO A PIXEL
Ricavate le coordinate 2D si inizia il processo di rasterizzazione nel quale si verifica quali pixel sono all'interno del triangolo.

Ugolini's graphic engine

La nascita

Ok, ma se qualcuno l'ha gia fatto, perchè rifarlo?

Le librerie

"Non si può programmare un motore grafico in assembly"

cit: Qualsiasi persona sana di mente

Che librerie ho utilizzato?

Meno possibili (progetto a scopo didattico)
Andando avanti
Quando ho iniziato
#include "Windows.h"
Print("cubo")

Motore grafico - cosa avevo già fatto

I primi cubi
I primi bug
Importazioni di oggetti (.obj)
22 Novembre
22 Dicembre
1 Gennaio
24 Febbraio
30 Novembre
24 Gennaio
24 Dicembre
Le prime risoluzioni

Motore grafico - cosa avevo già fatto

Luce speculare
24 Febbraio
2 Marzo
1 Marzo
11 Aprile
Prime prove di per-pixel shading
Importazioni di materiali (.mtl)

Per-pixel shading e la gpu

grafica moderna

PERCHÈ FARLO DA CAPO?
Per-triangle shading
+ Facile da implementare
+ Facile da implementare
+ Computazionalmente "leggero"
+ Computazionalmente "leggero"
- Non realistico
- Non realistico
+ Più realistico
+ Più realistico
- Serve una struttura del codice solida
- Serve una struttura del codice solida
- La mia CPU implorava pietà
- La mia CPU implorava pietà
Per-pixel shading

I vantaggi di usare la gpu

+ Estremo calcolo parallelo
+ Adesso la mia CPU ha un amica con cui può implorare pietà insieme
- Lento trasferimento dati (deve passare per le PCI)
- Codice da rendere parallelizzabile
- Debuggare è un parto
-Tanti "processori" ma poco potenti
- Pochi processori ma molto potenti

No spoiler

Let's run it

4.0

NEW FEATURES

Texture maps

Textures

Textures

Ogni triangolo ha associato un materiale e 3 punti chiamati UV
Il materiale può avere una texture associata
Ogni pixel all'interno del triangolo prenderà il valore della texture a coordinate UV, prodotte grazie all'interpolazione tra le coordinate UV dei vertici

NORMAL MAPS

Le normal map sono mappe contenenti vettori chiamati normali
Questi definiscono come, per ogni pixel, la luce riflette su di essi
La mappatura richiede, oltre alle interpolazioni, una trasformazione spaziale (matrici)
LUCI
LUCI
I tre tipi generali:
Spot light
Spot light
Point light
Point light
Directional light
Directional light

4.1

NEW FEATURES

Post processing

HDR

A cosa serve?

Come funziona?

Aumenta il range di colori che si possono processare

Rende possibili alcuni effetti post-processing, quale il bloom

Consiste nel salvare i colori in floating point (-∞,+∞), invece che in uint8 (1 byte, 0->255)

L'HDR significa high dynamin range, o ampia gamma dinamica

BLOOM

THRESHOLD

Tenuti i valori che superano una soglia

DOWNSCALE

Abbassamento risoluzione

BLUR

Sfocatura

REPEAT AND ADD

Ripeti il processo dalle 3 alle 11 volte e aggiungi i risultati

TONE MAPPING

Il tonemapping serve per riportare il range dinamico (HDR) ad una scala di un byte (0->255)
Uno degli algoritmi più usati è l'ACES, io ho utilizzato una verisone semplificata sviluppata da Narkowicz

LA struttura

in breve :P

ORGANIZZAZIONE DATI

Caricare un nuovo triangolo

Un triangolo ha diversi attributi: i punti in spazio assoluto, le coordinate UV e colore / texture.

I punti verranno salvati in un array unico per tutti i triangoli, così come le coordinate UV

Gli attributi riguardanti il colore, come texture e coefficenti di riflessione verranno salvati a parte in strutture dati chiamate materiali

Per non salvare copie inutili degli stessi punti, i triangoli, inizialmente, salveranno solo l'indice (ID) dei punti e materiale associato, verranno copiati i valori di essi solo in seguito (primitive assembler)

TriangoLo

Triangolo figura geometrica composta da tre punti... giusto?

Gli attributi di un triangolo non sono pochi

Coordinate spaziali
Attributi per normal maps
x3
Punti in spazio assoluto (world space, 3D)
x1
Normale, tangente, bitangente (3D)
x3
Punti in spazio relativo alla camera (relToCam space, 3D)
x3
Punti sullo schermo (screen space, 2D)
Attributi per texture
Attributi per interpolazione
Coordinate UV (texture space, 2D)
x3
x3
Punti sullo spazio relToCam/z (perspective corrected, 3D)
x1
Indice del materiale (materialId)
200 byte

graphic pipeline

Processo logico

l'organizzazione logica - schema generale

Ok tutto, ma... come si transforma in codice?

Per passare da concetti a codice c'è bisogno di una solida organizzazione logica. Qui ho riportato un breve schema riguardante la gestione dei dati tra CPU - GPU

Trasferimento dati iniziale

Cosa viene trasferito?
Punti, coordinate UV e triangoli (ID), vengono trasferiti sulla GPU

DENTRO IL PROCESSO DELLA GPU

Vertex shader

Lo scopo di questo processo è processare i punti in spazio assoluto in modo da ottenerli in spazio relToCam.

PRIMItive assembler

I triangoli una volta trasferiti sulla GPU, ancora sottoforma di TriangleId, vengono composti in una struct chiamata GPU_Triangle, che contiene copie dei punti e non più indici relativi all'array dei vertici
Questi triangoli verranno archiviati nell'array gpuSH.triangles

Light rotation

Le posizioni delle luci sono separate dal resto dei punti, necessitano quindi di una funzione a parte per la roto-traslazione da spazio assoluto a spazio relToCam.
Qui i vettori di direzione, contenuti da luci direzionali e spotlight, vengono ruotati.

CLIPPing

I triangoli potrebbero parzialmente uscire dallo schermo. In questo caso il programma itererebbe comunque per ogni punto del triangolo risultando in migliaia di operazioni inutili.
Per questo motivo viene introdotto il clipping. Il clipping serve ad eliminare le parti di triangolo che escono dallo schermo.
Eliminare parti di triangolo può dar luogo ad un poligono che deve quindi essere diviso in più triangoli.
Il clipping viene eseguito una volta per lato dello schermo, rendendo raro, ma possibile il caso in cui un solo triangolo generi 15 nuovi triangoli.
Questo è un grosso problema se si sta programmando in parallelo, dato che ogni triangolo avrà bisogno di 16 celle
RASTERIZZAZIONE
Una volta clippato, ogni triangolo viene suddiviso in quadranti e vengono avviati più thread per singolo triangolo.
Verranno avviati 256 thread per triangolo, quindi 4 triangoli alla volta (per processore). Per ridurre i tempi i triangoli verranno processati in ordine diverso rispetto all'indice con cui
FRAGMENT SHADER
C'é altro?

Durante la rasterizzazione, il colore del pixel non viene calcolato: molti triangoli sono sovrapposti sarebbe uno spreco di risorse, si preferisce infatti salvarsi le informazioni per il calcolo del colore in strutture chiamate Frammenti e calcolare il colore alla fine

Per il calcolo del colore viene lanciato un thread per Fragment e il risultato (in float) viene archiviato della mappa rgb HDR

Thanks

Made by ugolini

Aiuto ;)
Fine