現在、C++ と DirectX9 を使用するプロジェクトに取り組んでおり、時間の経過とともに色が変化する光源の作成を検討しています。
C++ には timeGetTime() 関数があることは知っていますが、これを可能にする HLSL の関数を誰かが知っているかどうか疑問に思っていましたか?
よろしく。マイク。
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 など)。
私は HLSL には詳しくありませんが、GLSL には精通しています。
シェーダーには「時間」や「フレーム」の概念がありません。頂点シェーダーはレンダリングする頂点を「理解」し、ピクセル シェーダーはレンダリングするテクスチャーを「理解」します。
唯一のオプションは、変数をシェーダー プログラムに渡すことです。GLSL では「ユニフォーム」と呼ばれますが、HLSL についてはわかりません。
時間の経過とともに色が変化する光源の作成を検討しています。
ただし、それで何かを渡す必要はありません。光源の色を直接設定できます (少なくとも、OpenGL では可能です)。レンダリング シーンでライトの色を変更するだけで、シェーダーは組み込みのユニフォームからそれを取得する必要があります。
いいえ。シェーダーは基本的に「一方向」です。CPU は GPU で起こっていること (実行するシェーダー プログラムの指定、テクスチャや定数のアップロードなど) に影響を与えることができますが、GPU はフェンスの CPU 側では何にもアクセスできません。GPU (およびシェーダー) がデータの一部を必要とする場合、CPU によって定数として設定されるか、テクスチャとして (または頂点データの一部として) 書き込まれる必要があります。
HLSL を使用して Unity のシェーダーを作成している場合、time in seconds 変数が として公開され_Time
ます。