Смешайте вершинный шейдер asm с пиксельным шейдером HLSL в действии

Я работаю с устаревшим кодом, который использует код шейдера сборки vs_2_0 и ps_2_0 в файле эффекта. Я хочу добавить несколько пиксельных шейдеров для работы с существующим вершинным шейдером, но хотел бы использовать HLSL. Можно ли добавить пиксельный шейдер HLSL по той же методике, что и вершинный шейдер asm? Если да, то как мне получить доступ к выходным данным вершинного шейдера (oT0, oT1) в моем пиксельном шейдере HLSL? Я новичок в шейдерах в целом, поэтому чем проще, тем лучше.


person Matthew Dickerson    schedule 22.01.2021    source источник
comment
Сборка шейдеров DirectX очень давно не поддерживается. Какую версию DirectX SDk вы используете?   -  person Chuck Walbourn    schedule 23.01.2021


Ответы (1)


Если вы используете структуру эффектов dx9, то для настройки техники вы можете

technique tech {
pass p0
    {
        VertexShader = 
        asm {
           // vertex shader assembly code goes here
           // ...
        };
        // compile MyAwsomePS as psTEXCOORD#0 and assign to PixelShader.
        PixelShader= compile psTEXCOORD#0 myAwsomePS();
    
    }
}

Как показано в MSDN

А для сопоставления выходных данных проверьте DirectX 9 hlsl Semetics и psTEXCOORD#0 входные регистры, для psTEXCOORD#0 доступно TEXCOORD# COLOR#, которое будет компилироваться в t# и v# соответственно.

Например:

struct PSInput
{
    float4 txcoord : TEXCOORD2;  // this will be t2
    float4 color : COLOR0; // this will be v0

};

float4 myAwsomePS(PSInput IN) : COLOR
{
    return IN.color + IN.txcoord;
}

компилируется в

    ps_2_0
    dcl t2
    dcl v0
    mov r0, v0
    add r0, r0, t2
    mov oC0, r0

Я бы также рекомендовал использовать автономный компилятор hlsl. (fxc), чтобы вывести список выходных данных сборки и самостоятельно проверить, все ли в порядке. или рассматривается возможность использования удобного онлайн-компилятора шейдеров Тима Джонса

person kingeric1992    schedule 02.02.2021