HLSL DirectX9:是否有getTime()函数或类似函数?

时间:2009-11-29 21:36:58

标签: c++ function time directx hlsl

我目前正在开发一个使用C ++和DirectX9的项目,我正在研究创建一个随着时间的推移颜色不同的光源。

我知道C ++有一个timeGetTime()函数,但想知道是否有人知道HLSL中的一个函数可以让我这样做?

的问候。 麦克

4 个答案:

答案 0 :(得分:6)

在HLSL中使用着色器常量(请参阅此introduction)。下面是使用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; 
} 

然后在你的渲染(CPU)代码中,在你应该调用的效果上调用Begin():

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

如果您不理解着色器常量的概念,请快速阅读PDF。您可以将任何HLSL数据类型用作常量(例如bool,float,float4,float4x4和朋友)。

答案 1 :(得分:4)

我不熟悉HLSL,但我使用的是GLSL。

着色器没有“时间”或“帧”的概念。顶点着色器“理解”要渲染的顶点,并且像素着色器“理解”要渲染的纹理。

你唯一的选择是将变量传递给着色器程序,在GLSL中它被称为“制服”,但我不确定HLSL。

  

我正在研究创造一种光   颜色随时间变化的来源   继续。

但是,没有必要传递任何东西。您可以直接设置光源的颜色(至少可以在OpenGL中设置)。只需更改渲染场景中的灯光颜色,着色器就应该从内置制服中拾取它。

答案 2 :(得分:1)

不。着色器基本上是“单向的”。 CPU可以影响GPU上发生的事情(指定运行哪个着色器程序,上传纹理和常量等),但GPU无法访问围栏CPU侧的任何内容。如果GPU(和着色器)需要一个数据,它必须由CPU设置为常量或写为纹理(或作为顶点数据的一部分)

答案 3 :(得分:0)

如果您正在使用HLSL为Unity编写着色器,则以秒为单位的时间变量将显示为 _Time