Casino online









Mercato forex






B10. HLSL: le tecniche Colored e ColoredPlus


Nel tutorial precedente, ho illustrato la sintassi di base di hlsl, ma è difficile imparare senza avere qualche esempio da esaminare. In questa lezione e nella prossima, commenterò il codice contenuto nel file SimpleShader.fx che avete scaricato con il pacchetto iniziale del progetto, spiegando come vengono scritte le varie tecniche.


La tecnica Colored
Apriamo con un qualsiasi editor di testo il file SimpleShader.fx. Al suo interno c'è molto codice, ma notate subito dai commenti (che sono individuati dai caratteri "//") che ho suddiviso il sorgente in quattro parti, corrispondenti ognuna ad una tecnica diversa. Inoltre, come avevo accennato nel capitolo precedente, i parametri si trovano tutti all'inizio. Fra questi e le altre dichiarazioni, solo ciò che riporterò di seguito riguarda la tecnica Colored:
struct VertexToPixel
{
    float4 Position           : POSITION;    
    float4 Color           : COLOR0;
    float  LightingFactor  : TEXCOORD0;
    float2 TextureCoords   : TEXCOORD1;
};

struct PixelToFrame
{
    float4 Color : COLOR0;
};

float4x4 View;
float4x4 Projection;
float4x4 World;

//...

//--------------------------------------------
//Tecnica 1 : Colore
//--------------------------------------------

VertexToPixel ColoredVertexShader(float4 inPos : POSITION, float4 inColor: COLOR)
{    
    VertexToPixel Output = (VertexToPixel)0;
    
    float4x4 ViewProjection = mul(View, Projection);
    float4x4 WorldViewProjection = mul(World, ViewProjection);
    
    Output.Position = mul(inPos, WorldViewProjection);
    Output.Color = inColor;
    
    return Output;    
}

PixelToFrame ColoredPixelShader(VertexToPixel inPixel) 
{
    PixelToFrame Output = (PixelToFrame)0;        
    
    Output.Color = inPixel.Color;
    
    return Output;
}

technique Colored
{
    pass Pass0
    {   
        VertexShader = compile vs_1_1 ColoredVertexShader();
        PixelShader  = compile ps_1_1 ColoredPixelShader();
    }
}
Ora, analizziamo il sorgente passo passo, uno statement alla volta:

La tecnica ColoredPlus
La novità introdotta in questa tecnica consiste nel poter calcolare anche quanta luce un punto riceve, e quindi, diffonde, basandosi sulle normali e sulla direzione iniziale della luce stessa. Dato che tutto il codice usato per questa tecnica è uguale a quello di Colored, con le uniche due eccezioni del vertex shader e del pixel shader, riporterò solo questi ultimi due: Ed ecco svelati tutti i misteri sulle due tecniche.


Ancora qualche dubbio...
Se avete assimilato bene i concetti e avete seguito le mie dimostrazioni e le mie spiegazioni a questo punto potreste avere alcuni dubbi, due dei quali trovano risposta in questo paragrafo aggiuntivo.
  1. Se la posizione è determinata da un Vector3, come mai nei parametri del vertex shader è rappresentata da un float4?
    Ottima domanda. La soluzione non è molto prevedibile ed è per questo che non è semplice. La quarta coordinata viene calcolata prima che si passi il punto al vertex shader, e si chiama w: essa contiene un coefficiente particolare per cui, dividendo ogni altra componente (x, y o z) per w si ottiene un numero compreso tra 0 e 1. La useremo in seguito in alcuni shader più complessi.
  2. Se il vertex shader elabora solo i vertici, come fa il pixel shader a colorare tutti i punti dello spazio?
    Il passaggio tra vertex shader e pixel shader non è vuoto: ricordate che c'è l'interpolatore, il quale, tra le altre cose, ha il compito di interpolare dai vertici, tutti i punti facenti parte della superficie del triangolo limitato da quei vertici, e assegnarvi posizioni, colori, normali, coordinate texture, eccetera...
E con questo mi sembra di aver chiarito ogni dubbio.





 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.