Могу ли я вычислить глобальную переменную в HLSL до применения вершинного шейдера?

есть три глобальные переменные 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(); 
    }
}

Однако это неправильный синтаксис. Что я должен делать?

Должен ли я вычислять эту переменную в коде С++ перед рендерингом?


person Gimun Eom    schedule 02.07.2012    source источник


Ответы (1)


Эффекты DirectX 9 и 10 поддерживают «прешейдеры», в которых статические выражения извлекаются для автоматического выполнения на ЦП.

См. 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 для создания списка. Это не очень интересные шейдеры...

person Slagh    schedule 10.07.2012