Как добавить непрозрачность для объектов в DirectX11 с помощью шейдеров - PullRequest
0 голосов
/ 27 мая 2019

Я новичок в directx, и мне нужно настроить непрозрачность в моих шейдерах.Я не использую текстуры или что-то еще, и мне просто нужно добавить непрозрачность для целых объектов на основе одной переменной в шейдере.

Я пытался просто поместить эту переменную в выходной цветовой альфа-канал шейдера, но это нене работает, и я думаю, что решение этой проблемы не в шейдерах.Пока это мой шейдер.

cbuffer ConstantBuffer : register(b0)
{
    matrix World;
    matrix View;
    matrix Projection;
    float4 vLigthDir[2];
    float4 vLigthColor[2];
    float4 vOutputColor;
    float intensity;
    float3 colors;
}

struct VS_INPUT
{
    float4 pos : POSITION;
    float3 norm : NORMAL;
};

struct PS_INPUT
{
    float4 pos : SV_POSITION;
    float3 norm : TEXCOORD0;
};

PS_INPUT VS(VS_INPUT input)
{
    PS_INPUT output = (PS_INPUT) 0;
    output.pos = mul(input.pos, World);
    output.pos = mul(output.pos, View);
    output.pos = mul(output.pos, Projection);
    output.norm = mul(input.norm, World);

    return output;
}

float4 PS(PS_INPUT input) : SV_Target
{
    float4 finalColor = 0;
    finalColor.r = colors.r;
    finalColor.g = colors.g;
    finalColor.b = colors.b;
    finalColor.a = intensity;
    return finalColor;
}

float4 PSSolid(PS_INPUT input) : SV_Target
{
    return vOutputColor;
}
//Create BlendState
    D3D11_BLEND_DESC blendDesc;
    blendDesc.AlphaToCoverageEnable = false;
    blendDesc.IndependentBlendEnable = false;

    blendDesc.RenderTarget[0].BlendEnable = true;
    blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
    blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
    blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

    hr = g_pd3dDevice->CreateBlendState(&blendDesc, &pBlendState);

//Using BlendState
    float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
    UINT sampleMask = 0xffffffff;
    g_pImmediateContext->OMGetBlendState(&pBlendState, blendFactor, &sampleMask);
///////////Rendering geometry part///////////
    g_pImmediateContext->OMGetBlendState(NULL, NULL, NULL);

Я ожидаю, что некоторые объекты будут иметь непрозрачность, но вместо этого ничего не происходит, есть только сплошной цвет.

...