首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX10,渲染到渲染目标-无Alpha

DirectX10,渲染到渲染目标-无Alpha
EN

Stack Overflow用户
提问于 2015-04-17 00:42:49
回答 1查看 120关注 0票数 0

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

如果我将纹理保存到一个文件中,任何地方都没有渲染,它就是清晰的颜色。在渲染的任何地方,都有alpha = 0。

我的blendstate:

代码语言:javascript
复制
            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);

在渲染之前:

代码语言:javascript
复制
        this->m_pDevice->OMSetBlendState(this->m_pBlendState, 0, 0xffffffff);

绘制砖块的Shadercode:

代码语言:javascript
复制
    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()));
   }
};
EN

回答 1

Stack Overflow用户

发布于 2015-04-17 04:04:52

将Rendertarget的Blendstate更改为

代码语言:javascript
复制
        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);

现在它起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29681078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档