如何使用着色器为DirectX11中的对象添加不透明度

时间:2019-05-27 07:26:56

标签: c++ directx-11 hlsl

我是DirectX的新手,我需要在着色器中设置不透明度。我不使用纹理或任何东西,我只需要基于着色器中的一个变量为整个对象添加不透明度。

我试图将这个变量简单地放在着色器的输出颜色alpha通道中,但是它不起作用,我想这个问题的解决方案不在着色器中。到目前为止,这是我的着色器。

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);

我希望某些对象具有不透明性,但是什么也没有发生,只有纯色。

0 个答案:

没有答案