HLSL DirectX9: есть функция getTime () или аналогичная? - PullRequest
3 голосов
/ 30 ноября 2009

В настоящее время я работаю над проектом, использующим C ++ и DirectX9, и пытаюсь создать источник света, цвет которого меняется со временем.

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

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

Ответы [ 4 ]

6 голосов
/ 30 ноября 2009

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

4 голосов
/ 30 ноября 2009

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

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

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

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

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

1 голос
/ 30 ноября 2009

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

0 голосов
/ 01 апреля 2016

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

...