【问题标题】:Can I calculate global variable in HLSL before vertex shader applied?我可以在应用顶点着色器之前计算 HLSL 中的全局变量吗?
【发布时间】:2012-07-02 16:20:40
【问题描述】:

共有三个全局变量g_A、g_B、g_C 我想做这个; g_C = g_A * g_B

我试过了;

technique RenderScene
{
    g_C = g_A * g_B;

    pass P0
    {          
        VertexShader = compile vs_2_0 RenderSceneVS();
        PixelShader  = compile ps_2_0 RenderScenePS(); 
    }
}

但是,它的语法不正确。 我该怎么办?

在渲染之前我必须在 c++ 代码中计算这个变量吗?

【问题讨论】:

    标签: hlsl directx-9


    【解决方案1】:

    DirectX 9 和 10 效果支持“预着色器”,其中静态表达式将被拉出以自动在 CPU 上执行。

    请参阅文档中的D3DXSHADER_NO_PRESHADER,这是一个禁止此行为的标志。这是一个网络链接:http://msdn.microsoft.com/en-us/library/windows/desktop/bb205441(v=vs.85).aspx

    您的g_C 声明缺少static 和类型,例如float。您还需要将其移至全局范围。

    当你用 fxc 编译它时,你可能会看到类似下面的内容(注意注释块后面的 preshader 块):

    technique RenderScene
    {
        pass P0
        {
            vertexshader = 
                asm {
                //
                // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
                //
                // Parameters:
                //
                //   float4 g_A;
                //   float4 g_B;
                //
                //
                // Registers:
                //
                //   Name         Reg   Size
                //   ------------ ----- ----
                //   g_A          c0       1
                //   g_B          c1       1
                //
    
                    preshader
                    mul c0, c0, c1
    
                // approximately 1 instruction used
                //
                // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
                    vs_2_0
                    mov oPos, c0
    
                // approximately 1 instruction slot used
                };
    
            pixelshader = 
                asm {
                //
                // Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111
                    ps_2_0
                    def c0, 0, 0, 0, 0
                    mov r0, c0.x
                    mov oC0, r0
    
                // approximately 2 instruction slots used
                };
        }
    }
    

    我编译了以下内容:

    float4 g_A;
    float4 g_B;
    static float4 g_C = g_A * g_B;
    
    float4 RenderSceneVS() : POSITION
    {
        return g_C;
    }
    
    float4 RenderScenePS() : COLOR
    {
        return 0.0;
    }
    
    technique RenderScene
    {
        pass P0
        {          
            VertexShader = compile vs_2_0 RenderSceneVS();
            PixelShader  = compile ps_2_0 RenderScenePS();
        }
    }
    

    使用fxc /Tfx_2_0 t.fx 生成列表。它们不是很有趣的着色器...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多