我目前正在使用 C++ 和 DirectX9 开发一个项目,我正在研究创建一个随着时间的推移颜色会发生变化的光源。
我知道 C++ 有一个 timeGetTime() 函数,但想知道是否有人知道 HLSL 中允许我这样做的函数?
问候。麦克风。
在 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 和朋友)。
我不熟悉 HLSL,但我熟悉 GLSL。
着色器没有“时间”或“帧”的概念。顶点着色器“理解”要渲染的顶点,像素着色器“理解”要渲染的纹理。
您唯一的选择是将变量传递给着色器程序,在 GLSL 中它被称为“统一”,但我不确定 HLSL。
我正在研究创建一个随着时间的推移颜色会发生变化的光源。
不过,没有必要传递任何东西。您可以直接设置光源的颜色(至少,您可以在 OpenGL 中)。只需更改渲染场景上的灯光颜色,着色器就会从内置的制服中拾取它。
没有。着色器本质上是“单向”的。CPU 可以影响 GPU 上发生的事情(指定要运行的着色器程序、上传纹理和常量等),但 GPU 无法访问 CPU 侧的任何内容。如果 GPU(和您的着色器)需要一段数据,则必须由 CPU 将其设置为常量或写入纹理(或作为顶点数据的一部分)
如果您使用 HLSL 为 Unity 编写着色器,则以秒为单位的时间变量将公开为_Time
.