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