2009-11-29 2 views
3

В настоящее время я работаю над проектом с использованием C++ и DirectX9, и я изучаю создание источника света, который меняется со временем.HLSL DirectX9: Есть ли функция getTime() или аналогичная?

Я знаю, что C++ имеет функцию timeGetTime(), но было интересно, знает ли кто-нибудь о функции в HLSL, которая позволит мне это сделать?

С уважением. Майк.

ответ

6

Используйте константу шейдера в 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).

+0

Спасибо всем - Эти ответы объясняют это совершенно :) – Mike

4

Я не знаком с HLSL, но я с GLSL.

Шейдеры не имеют понятия «время» или «рамки». Вершинный шейдер «понимает» вершины для рендеринга, а пиксельный шейдер «понимает» текстуры для рендеринга.

Ваш единственный вариант - передать переменную в шейдерную программу, в GLSL она называется «единообразной», но я не уверен в HLSL.

Я ищу в создании светового источника, который изменяется в цвете, как время продолжается.

При этом ничего не нужно передавать. Вы можете напрямую установить цвет источника света (по крайней мере, в OpenGL). Просто измените светлый цвет на сцену рендеринга, и шейдер должен забрать его из встроенной униформы.

1

Nope. Шейдеры по существу «односторонние». ЦП может повлиять на то, что происходит на графическом процессоре (указать, какую программу для шейдеров запускать, загружать текстуры и константы и т. Д.), Но графический процессор не может получить доступ к чему-либо на стороне процессора забора. Если для графического процессора (и вашего шейдера) требуется часть данных, он должен быть установлен ЦП в качестве константы или записан как текстура (или как часть данных вершин)

0

Если вы используете HLSL для записи шейдера для Unity, переменная времени в секундах отображается как _Time.

Смежные вопросы