【问题标题】:HLSL DirectX9: Is there a getTime() function or similar?HLSL DirectX9:是否有 getTime() 函数或类似函数?
【发布时间】:2009-11-29 21:36:57
【问题描述】:

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

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

问候。 迈克。

【问题讨论】:

    标签: c++ function time directx hlsl


    【解决方案1】:

    在 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 和朋友)。

    【讨论】:

    • 谢谢大家 - 这些答案完美地解释了它:)
    【解决方案2】:

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

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

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

    我正在研究创造一盏灯 颜色随时间变化的来源 继续。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果您使用 HLSL 为 Unity 编写着色器,则以秒为单位的时间变量会显示为 _Time

        【讨论】:

          猜你喜欢
          • 2011-08-20
          • 2019-10-21
          • 1970-01-01
          • 1970-01-01
          • 2013-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-03
          相关资源
          最近更新 更多