我目前正在研究一个使用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