我目前正在研究一個使用C++和DirectX9的項目,並且正在研究創建隨着時間的推移而變化的光源。HLSL DirectX9:有沒有getTime()函數或類似的?
我知道C++有一個timeGetTime()函數,但想知道是否有人知道HLSL中的函數會允許我這樣做?
問候。 Mike。
我目前正在研究一個使用C++和DirectX9的項目,並且正在研究創建隨着時間的推移而變化的光源。HLSL DirectX9:有沒有getTime()函數或類似的?
我知道C++有一個timeGetTime()函數,但想知道是否有人知道HLSL中的函數會允許我這樣做?
問候。 Mike。
在HLSL中使用着色器常量(請參閱這個introduction)。下面是例子HLSL代碼,使用timeInSeconds修改的紋理座標:
// 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;
}
,然後在渲染(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
。
謝謝大家 - 這些答案完美解釋:) – Mike 2009-11-30 13:01:51