3

現在、C++ と DirectX9 を使用するプロジェクトに取り組んでおり、時間の経過とともに色が変化する光源の作成を検討しています。

C++ には timeGetTime() 関数があることは知っていますが、これを可能にする HLSL の関数を誰かが知っているかどうか疑問に思っていましたか?

よろしく。マイク。

4

4 に答える 4

6

HLSL でシェーダー定数を使用します (この概要を参照してください)。timeInSeconds を使用してテクスチャ座標を変更する HLSL コードの例を次に示します。

// 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; 
} 

そして、呼び出す必要がある効果で Begin() を呼び出す前に、レンダリング (CPU) コードで:

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

シェーダー定数の概念を理解していない場合は、PDF をざっと読んでください。任意の HLSL データ型を定数として使用できます (bool、float、float4、float4x4 など)。

于 2009-11-29T22:30:52.043 に答える
4

私は HLSL には詳しくありませんが、GLSL には精通しています。

シェーダーには「時間」や「フレーム」の概念がありません。頂点シェーダーはレンダリングする頂点を「理解」し、ピクセル シェーダーはレンダリングするテクスチャーを「理解」します。

唯一のオプションは、変数をシェーダー プログラムに渡すことです。GLSL では「ユニフォーム」と呼ばれますが、HLSL についてはわかりません。

時間の経過とともに色が変化する光源の作成を検討しています。

ただし、それで何かを渡す必要はありません。光源の色を直接設定できます (少なくとも、OpenGL では可能です)。レンダリング シーンでライトの色を変更するだけで、シェーダーは組み込みのユニフォームからそれを取得する必要があります。

于 2009-11-29T21:43:28.213 に答える
1

いいえ。シェーダーは基本的に「一方向」です。CPU は GPU で起こっていること (実行するシェーダー プログラムの指定、テクスチャや定数のアップロードなど) に影響を与えることができますが、GPU はフェンスの CPU 側では何にもアクセスできません。GPU (およびシェーダー) がデータの一部を必要とする場合、CPU によって定数として設定されるか、テクスチャとして (または頂点データの一部として) 書き込まれる必要があります。

于 2009-11-29T21:56:00.733 に答える
0

HLSL を使用して Unity のシェーダーを作成している場合、time in seconds 変数が として公開され_Timeます。

于 2016-04-01T13:53:26.610 に答える