Используйте константу шейдера в HLSL (см. Это введение ). Вот пример кода 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;
}
И затем в вашем коде рендеринга (ЦП) перед вызовом Begin () для эффекта, который вы должны вызвать:
// C++
myLightSourceTime = GetTime(); // Or system equivalent here:
m_pEffect->SetFloat ("timeInSeconds ", &myLightSourceTime);
Если вы не понимаете концепцию шейдерных констант, быстро прочитайте PDF. В качестве константы можно использовать любой тип данных HLSL (например, bool, float, float4, float4x4 и friends).