【发布时间】:2009-11-29 21:36:57
【问题描述】:
我目前正在使用 C++ 和 DirectX9 进行一个项目,我正在研究创建一个随着时间的推移颜色会发生变化的光源。
我知道 C++ 有一个 timeGetTime() 函数,但想知道是否有人知道 HLSL 中允许我这样做的函数?
问候。 迈克。
【问题讨论】:
标签: c++ function time directx hlsl
我目前正在使用 C++ 和 DirectX9 进行一个项目,我正在研究创建一个随着时间的推移颜色会发生变化的光源。
我知道 C++ 有一个 timeGetTime() 函数,但想知道是否有人知道 HLSL 中允许我这样做的函数?
问候。 迈克。
【问题讨论】:
标签: c++ function time directx hlsl
在 HLSL 中使用着色器常量(参见 introduction)。这是使用 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;
}
然后在你的渲染(CPU)代码中调用 Begin() 之前你应该调用的效果:
// C++
myLightSourceTime = GetTime(); // Or system equivalent here:
m_pEffect->SetFloat ("timeInSeconds ", &myLightSourceTime);
如果您不了解着色器常量的概念,请快速阅读 PDF。您可以将任何 HLSL 数据类型用作常量(例如 bool、float、float4、float4x4 和朋友)。
【讨论】:
我不熟悉 HLSL,但我熟悉 GLSL。
着色器没有“时间”或“帧”的概念。顶点着色器“理解”要渲染的顶点,像素着色器“理解”要渲染的纹理。
您唯一的选择是将变量传递给着色器程序,在 GLSL 中它被称为“统一”,但我不确定 HLSL。
我正在研究创造一盏灯 颜色随时间变化的来源 继续。
不过,没有必要传递任何东西。您可以直接设置光源的颜色(至少,您可以在 OpenGL 中)。只需更改渲染场景中的灯光颜色,着色器就会从内置的制服中拾取它。
【讨论】:
不。着色器本质上是“单向”的。 CPU 可以影响 GPU 上发生的事情(指定要运行的着色器程序、上传纹理和常量等),但 GPU 无法访问 CPU 侧的任何内容。如果 GPU(和您的着色器)需要一段数据,则必须由 CPU 将其设置为常量或写入纹理(或作为顶点数据的一部分)
【讨论】:
如果您使用 HLSL 为 Unity 编写着色器,则以秒为单位的时间变量会显示为 _Time。
【讨论】: