Gli Effetti sono il modo in cui direct3d combina i vertex- e pixelshaders in un unico file.
Lo schema di base di un file Effetto è come questo che segue:
technique1
pass1 (vertexshader, pixelshader) pass2 (vertexshader, pixelshader) ..
technique2
pass1 (vertexshader, pixelshader) pass2 (vertexshader, pixelshader) ..
Un Effetto contiene i parametri che verranno usati dalle funzioni, le funzioni vertex- e pixelshader stesse e le tecniche, dove si possono definire con quali shaders un oggetto sta per essere disegnato (rendered, dall'inglese to render: rendere graficamente) ed impostare le condizioni di disegno e quelle del campionatore.
I parametri sono variabili che vengono dichiarate all'interno di un Effetto, e possono essere impostate direttamente nell'effetto o dall'applicazione (attravrso la patch di vvvv). I Parametri possono essere di qualsiasi tipo di dato definito in HLSL.
Per ciascun parametro definito in un effetto vvvv genera un input pin appropriato nel nodo effetto. Tramite questi pins i valori possono essere impostati per i parametri dall'interno di vvvv (nella patch).
Ai parametri può essere assegnata una semantica, che specifica come un parametro verrà gestito dall'effetto dell'applicazione che lo ospita (cioè vvvv). Per esempio se definiamo un parametro di tipo float4 (un vettore di 4 numeri a virgola mobile, vector of 4 floats) e lo dichiariamo con la semantica "COLOR", vvvv genererà un input pin per il colore nel nodo effetto.
Tramite la semantica abbiamo anche l'accesso alle matrici vista e proiezione (ed a tutte le loro combinazioni con la matrice mondo, WorldMatrix - "and all of its combinations with the world matrix + transformed and inverse", dalla versione inglese di questa pagina) del renderer. Per i parametri matrice dichiarati con una semantica, non verrà aggiunto alcun pin nel nodo dato che queste matrici sono impostate automaticamente dal nodo effetto e perciò non saranno visibili (ad eccezione della WorldMatrix).
La semantica supportata da vvvv è riportata nella pagina it.EX9.HLSL.Semantica.
Per la descrizione di un parametro si possono usare le annotazioni it.EX9.HLSL.Annotations.
Attualmente vvvv supporta solo tre annotazioni. La più importante da menzionare è l'annotazione "uiname" di tipo stringa, che definirà il nome del pin che rappresenta un parametro nel nodo effetto. Se non usate questa annotazione al pin verrà assegnato il nome del parametro nel file Effetto.
Si possono definire funzioni in HLSL per incapsulare o modularizzare il codice. Le funzioni in HLSL vengono dichiarate in maniera simile a C/C++/C#. Hanno un tipo di ritorno, return type, un nome, parametri di input ed il corpo della funzione. Un effetto può avere molte funzioni: VertexShader e PixelShader sono le funzioni principali di un effetto, dall'interno delle quali altre funzioni possono venire richiamate.
La funzione VertexShader viene eseguita per ogni vertice di una mesh (geometria/modello 3d). In un VertexShader, l'elaborazione di un vertice nella pipeline di rendering è sviluppata attraverso questi passaggi: WorldTransform, ViewTransform, illuminazione, materiali e ProjectionTransform. Qui possono essere eseguite operazioni più complesse come il VertexBlending (per l'animazione) o il morphing.
La funzione PixelShader viene eseguita per ciascun pixel di una mesh. Dopo che il modello sia stato proiettato nello spazio 2d dello schermo e che il rasterizzatore abbia definito ogni pixel di una mesh, si può eseguire un PixelShader per calcolare il colore di ciascuno di quei pixels. Così si possono realizzare l'Illuminazione Avanzata per Pixel e differenti operazioni come filtri, trasformazioni, multi-texturing, bump e normal mapping.
Ogni effetto deve contenere almeno una tecnica. Una tecnica contiene uno o più passaggi. In ciascun passaggio si può dichiarare una funzione Pixelshader o VertexShader, che vengono poi usate per il rendering dei quel passaggio.
Una semplice tecnica di base può essere la seguente:
technique TSimpleShader { pass P0 { VertexShader = compile vs_1_1 VS(); PixelShader = compile ps_1_0 PS(); } }
VS() e PS() sono i nome delle funzioni Vertex e Pixelshader.
Se una tecnica contiene diversi passaggi, la mesh viene disegnata, rendered, per ciascuno di questi passaggi secondo quanto stabilito con i Vertex e PixelShaders.
Attraverso le tecniche si possono generare diverse versioni di un effetto. Queste possono realizzare un effetto simile su differenti GPU (Graphics Processing Unit, in sostanza il microprocessore della scheda grafica), o anche fornire versioni alternative di un effetto.
anonymous user login
~4d ago
~7d ago
~14d ago
~22d ago
~29d ago
~1mth ago
~1mth ago
~1mth ago
~1mth ago
~1mth ago