DirectX10,渲染到一个Rendertarget - 没有Alpha

时间:2015-04-16 16:42:49

标签: c++ directx hlsl

我的问题是,当我渲染到具有绑定到它的纹理的rendertarget时,无法看到渲染的信息,因为alpha为0。 如果我在显示渲染目标时将着色器中的alpha值设置为1,那么我可以清楚地看到它。

如果我将纹理保存到文件中,那么在没有任何渲染的地方,它就是清晰的颜色。无处不在,呈现某些东西的地方,alpha = 0。 enter image description here

我的混合状态:

            D3D10_BLEND_DESC BlendState;
            ZeroMemory(&BlendState, sizeof(D3D10_BLEND_DESC));
            BlendState.AlphaToCoverageEnable = FALSE;
            for (int32 i=0;i<this->m_TextureCount;i++)
                BlendState.BlendEnable[i] = TRUE;
            BlendState.SrcBlend = D3D10_BLEND_SRC_ALPHA;
            BlendState.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
            BlendState.BlendOp = D3D10_BLEND_OP_ADD;
            BlendState.SrcBlendAlpha = D3D10_BLEND_ZERO;
            BlendState.DestBlendAlpha = D3D10_BLEND_ZERO;
            BlendState.BlendOpAlpha = D3D10_BLEND_OP_ADD;
            for (int32 i = 0; i<this->m_TextureCount; i++)
                BlendState.RenderTargetWriteMask[i] = D3D10_COLOR_WRITE_ENABLE_ALL;

            this->m_pDevice->CreateBlendState(&BlendState, &this->m_pBlendState);

渲染前:

        this->m_pDevice->OMSetBlendState(this->m_pBlendState, 0, 0xffffffff);

Shadercode绘制砖块:

    float4x4 View;
float4x4 Projection;

Texture2D Diffuse;

SamplerState TextureSampler
{
  Filter = MIN_MAG_MIP_Linear;
  AddressU = WRAP;
  AddressV = WRAP;
};
struct VertexShaderInput
{
  float3 Position : POSITION0;
  float2 UV       : TEXCOORD0;
  float3 Color    : COLOR0;
  float3 Normal   : NORMAL0;
  row_major float4x4 Offset   : MATRIX;
};

struct VertexShaderOutput
{
  float4 PositionOut : SV_POSITION;
  float4 Position : POSITION0;
  float2 UV       : TEXCOORD0;
  float3 Color    : COLOR0;
  float3 Normal   : NORMAL0;
};

struct PixelShaderOutput
{
  float4 colorMap: SV_TARGET0;
  float4 normalMap: SV_TARGET1;
  float4 positionMap: SV_TARGET2;
};


VertexShaderOutput VS_MAIN(VertexShaderInput input)
{
  VertexShaderOutput Output = (VertexShaderOutput)0;

  float4 pos = float4(input.Position.xyz, 1);

  float4x4 Model = input.Offset;

  float4x4 MVP = mul(mul(Model,View),Projection);

  Output.Position = mul(pos,MVP);
  Output.PositionOut = mul(pos,MVP);

  Output.UV = input.UV;

  Output.Color = input.Color;

  Output.Normal = normalize(mul(input.Normal,(float3x3)Model));

  return Output;
}

PixelShaderOutput PS_MAIN(VertexShaderOutput input)
{
  PixelShaderOutput output;

  output.colorMap = float4(1,0,0,1); // This is the texture above
  output.normalMap = float4(input.Normal,1);
  output.positionMap = float4(input.Position.xyz,1);

  return output;
}


technique10 Main
{
  pass p0
  {
    SetVertexShader(CompileShader(vs_4_0, VS_MAIN()));
    SetGeometryShader(NULL);
    SetPixelShader(CompileShader(ps_4_0, PS_MAIN()));
   }
};

1 个答案:

答案 0 :(得分:0)

将Rendertarget的Blendstate更改为

        D3D10_BLEND_DESC BlendState;
        ZeroMemory(&BlendState, sizeof(D3D10_BLEND_DESC));
        BlendState.AlphaToCoverageEnable = true;
        for (int32 i=0;i<this->m_TextureCount;i++)
            BlendState.BlendEnable[i] = TRUE;
        BlendState.SrcBlend = D3D10_BLEND_SRC_ALPHA;
        BlendState.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
        BlendState.BlendOp = D3D10_BLEND_OP_ADD;
        BlendState.SrcBlendAlpha = D3D10_BLEND_SRC_ALPHA;
        BlendState.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
        BlendState.BlendOpAlpha = D3D10_BLEND_OP_ADD;
        for (int32 i = 0; i<this->m_TextureCount; i++)
            BlendState.RenderTargetWriteMask[i] = D3D10_COLOR_WRITE_ENABLE_ALL;

        this->m_pDevice->CreateBlendState(&BlendState, &this->m_pBlendState);

它现在有效。