0

有三个全局变量 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++ 代码中计算这个变量吗?

4

1 回答 1

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列表。他们不是很有趣的着色器......

于 2012-07-10T22:59:23.830 回答