Repository navigation
Core Shader
Il core può applicare effetti all'intero frame dopo avere disegnato le scene. Game offre tre modalità:
| Modalità | Classe | Uso |
|---|---|---|
Rendering::SDL |
Window |
Rendering SDL senza post-processing |
Rendering::SDL_CPU_SHADERS |
CPUShaderWindow |
Effetti C++ sui pixel |
Rendering::SDL_GPU_SHADERS |
GPUShaderWindow |
Fragment shader tramite SDL_GPU; può applicare anche un effetto CPU |
Quando è attivo un effetto CPU, le scene vengono disegnate su una texture. SDL legge i pixel in memoria, una funzione C++ li modifica e il risultato viene ricaricato e presentato. La funzione riceve puntatore ai pixel, larghezza, altezza e pitch in byte:
void effect(Uint32* pixels, int width, int height, int pitch)
{
// Elabora ogni riga rispettando pitch.
}setShader(effect) lo attiva; setShader(nullptr) lo disattiva. Il metodo è disponibile sia su CPUShaderWindow sia su GPUShaderWindow. In ActionRPG la maschera circolare dei portali e la luce del tasto L restano effetti CPU, anche se il gioco usa la finestra GPU. Se non è impostato alcun effetto CPU, il frame non viene letto dalla GPU per questa elaborazione.
Il costo cresce con il numero di pixel e con i trasferimenti GPU/CPU: raddoppiare entrambe le dimensioni quadruplica i pixel da elaborare. Gli effetti CPU sono quindi adatti soprattutto a dimostrazioni o transizioni brevi.
GPUShaderWindow usa il renderer SDL3 basato su SDL_GPU. Con uno o più effetti attivi, disegna le scene su una texture e applica ciascun fragment shader all'intero frame. Più effetti sono eseguiti in sequenza, nell'ordine di attivazione; il risultato di un passaggio diventa l'input del successivo. L'eventuale effetto CPU viene applicato prima di quelli GPU. Se non sono attivi effetti, la finestra usa il normale percorso di rendering SDL.
Un gioco carica e gestisce gli effetti per nome:
auto* window = static_cast<GPUShaderWindow*>(Game::instance()->window());
window->loadShader("rain", "assets/shaders/rain.frag");
window->applyShader("rain");
window->removeShader("rain");loadShader() cerca gli asset rispetto a SDL_GetBasePath(), cioè alla cartella dell'eseguibile. Gli shader sono file separati: il sorgente è .frag.hlsl, mentre il programma carica il formato precompilato supportato dal backend (.msl per Metal, .dxil per Direct3D 12, .spv per Vulkan). Il parametro assetPath non include l'estensione del formato. Le modifiche all'HLSL richiedono la rigenerazione dei tre file con shadercross; CMake li copia a ogni build, ma non li compila. Il comando di esempio è nel README di postprocessing.
Il core richiede WITH_SHADERS e SDL3 3.4 o successiva per questa modalità. Se SDL_GPU non trova un backend utilizzabile, GPUShaderWindow ripiega sul renderer SDL normale: il gioco resta avviabile e gli effetti GPU sono disabilitati. Gli effetti CPU di ActionRPG restano disponibili.
CustomPlatformer, Box2DPlatformer e ActionRPG condividono dieci effetti in postprocessing/assets/shaders/. Premi un numero per attivare l'effetto e premilo di nuovo per disattivarlo. Si possono combinare più effetti.
| Tasto | Effetto | Aspetto |
|---|---|---|
1 |
rain |
Pioggia animata, scena più cupa e lampi di luce fredda a intervalli pseudo-casuali |
2 |
fog |
Nebbia densa, stratificata e mobile |
3 |
crt |
Curvatura, scanline e maschera RGB |
4 |
pixelate |
Mosaicatura, palette ridotta e dithering |
5 |
neon |
Contorni luminosi ciano e magenta |
6 |
heat |
Rifrazione e aberrazione cromatica |
7 |
nightvision |
Visione notturna con grana e vignettatura |
8 |
glitch |
Distorsioni orizzontali e separazione dei canali |
9 |
bloom |
Alone sulle zone chiare |
0 |
grayscale |
Scala di grigi calcolata dalla luminosità percepita |
Per iniziare, leggi grayscale.frag.hlsl: campiona un pixel, calcola una media pesata dei canali RGB e restituisce quel valore sui tre canali. I sorgenti HLSL contengono commenti sui passaggi principali di ogni effetto.
-
GPUShaderWindow.heGPUShaderWindow.cpp -
CPUShaderWindow.heCPUShaderWindow.cpp -
DemoShaders.heassets/shaders shaderUtils.h
Torna alla panoramica del core.
- Panoramica
- Diagramma delle classi
- Architettura e game loop
- Sequenza di un frame
- Input ed eventi
- Scene e oggetti
- Rendering e coordinate
- Sprite e testo
- UI e overlay
- Quadtree
- Servizi e asset
- Estendere il core
- Editor dei livelli
- LevelData e livelli JSON
- Shader