Domanda

Attualmente sto lavorando a un progetto usando C ++ e DirectX9 e sto cercando di creare una fonte di luce che varia di colore col passare del tempo.

So che C ++ ha una funzione timeGetTime (), ma mi chiedevo se qualcuno fosse a conoscenza di una funzione in HLSL che mi permettesse di farlo?

Saluti. Mike.

È stato utile?

Soluzione

Usa una costante shader in HLSL (vedi introduzione ). Ecco un codice HLSL di esempio che utilizza timeInSeconds per modificare le coordinate della trama:

// HLSL
float4x4 view_proj_matrix; 
float4x4 texture_matrix0; 
// My time in seconds, passed in by CPU program
float    timeInSeconds;

struct VS_OUTPUT 
{ 
   float4 Pos     : POSITION; 
   float3 Pshade  : TEXCOORD0; 
}; 


VS_OUTPUT main (float4 vPosition : POSITION) 
{ 
   VS_OUTPUT Out = (VS_OUTPUT) 0;  

   // Transform position to clip space 
   Out.Pos = mul (view_proj_matrix, vPosition); 

   // Transform Pshade 
   Out.Pshade = mul (texture_matrix0, vPosition);

   // Transform according to time
   Out.Pshade = MyFunctionOfTime( Out.Pshade, timeInSeconds );

   return Out; 
} 

E poi nel tuo codice di rendering (CPU) prima di chiamare Begin () sull'effetto che dovresti chiamare:

// C++
myLightSourceTime = GetTime(); // Or system equivalent here:
m_pEffect->SetFloat ("timeInSeconds ", &myLightSourceTime); 

Se non capisci il concetto di costanti dello shader, leggi rapidamente il PDF. Puoi utilizzare qualsiasi tipo di dati HLSL come costante (ad es. Bool, float, float4, float4x4 e amici).

Altri suggerimenti

Non ho familiarità con HLSL, ma sono con GLSL.

Gli shader non hanno il concetto di "tempo" o "frame". Vertex shader "capisce" vertici da renderizzare e pixel shader "capisce" trame da rendere.

L'unica opzione è quella di passare una variabile al programma shader, in GLSL si chiama 'uniforme', ma non sono sicuro di HLSL.

  

Sto cercando di creare una luce   fonte che varia di colore nel tempo   continua.

Non è necessario passare nulla con quello, però. Puoi impostare direttamente il colore della sorgente luminosa (almeno, puoi farlo in OpenGL). Basta cambiare il colore della luce sulla scena di rendering e lo shader dovrebbe prenderlo dalle uniformi incorporate.

No. Gli shader sono essenzialmente "a senso unico". La CPU può influire su ciò che sta accadendo sulla GPU (specificare quale programma shader eseguire, caricare trame e costanti e simili), ma la GPU non può accedere a nulla sul lato CPU della recinzione. Se la GPU (e il tuo shader) necessitano di un pezzo di dati, deve essere impostato dalla CPU come costante o scritto come una trama (o come parte dei dati del vertice)

Se stai usando HLSL per scrivere uno shader per Unity, una variabile time in seconds viene esposta come _Time .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top