3

我目前正在使用 C++ 和 DirectX9 开发一个项目,我正在研究创建一个随着时间的推移颜色会发生变化的光源。

我知道 C++ 有一个 timeGetTime() 函数,但想知道是否有人知道 HLSL 中允许我这样做的函数?

问候。麦克风。

4

4 回答 4

6

在 HLSL 中使用着色器常量(请参阅此介绍)。这是使用 timeInSeconds 修改纹理坐标的示例 HLSL 代码:

// 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() 之前的渲染(CPU)代码中你应该调用的效果:

// C++
myLightSourceTime = GetTime(); // Or system equivalent here:
m_pEffect->SetFloat ("timeInSeconds ", &myLightSourceTime); 

如果您不了解着色器常量的概念,请快速阅读 PDF。您可以使用任何 HLSL 数据类型作为常量(例如 bool、float、float4、float4x4 和朋友)。

于 2009-11-29T22:30:52.043 回答
4

我不熟悉 HLSL,但我熟悉 GLSL。

着色器没有“时间”或“帧”的概念。顶点着色器“理解”要渲染的顶点,像素着色器“理解”要渲染的纹理。

您唯一的选择是将变量传递给着色器程序,在 GLSL 中它被称为“统一”,但我不确定 HLSL。

我正在研究创建一个随着时间的推移颜色会发生变化的光源。

不过,没有必要传递任何东西。您可以直接设置光源的颜色(至少,您可以在 OpenGL 中)。只需更改渲染场景上的灯光颜色,着色器就会从内置的制服中拾取它。

于 2009-11-29T21:43:28.213 回答
1

没有。着色器本质上是“单向”的。CPU 可以影响 GPU 上发生的事情(指定要运行的着色器程序、上传纹理和常量等),但 GPU 无法访问 CPU 侧的任何内容。如果 GPU(和您的着色器)需要一段数据,则必须由 CPU 将其设置为常量或写入纹理(或作为顶点数据的一部分)

于 2009-11-29T21:56:00.733 回答
0

如果您使用 HLSL 为 Unity 编写着色器,则以秒为单位的时间变量将公开为_Time.

于 2016-04-01T13:53:26.610 回答