天天看點

Directx11教程(46) alpha blend(3)

      現在我們嘗試改變box的貼圖,使用一張帶alpha的dds檔案wirefence.dds,

用directx texture tool打開檔案界面如下:

Directx11教程(46) alpha blend(3)

      實際上,這幅圖中一些像素有alpha值,一些像素alpha值為0,我們點選View-alpha channel only,可以看到下面的圖,其中黑色部分的alpha值為0:

Directx11教程(46) alpha blend(3)

     現在我們把這幅圖貼到box上,程式運作效果如下:

Directx11教程(46) alpha blend(3)

我們在lighttex.ps中增加以下代碼,需要注意clip函數的使用。

float3 N = normalize(input.worldnormal);

float4 textureColor = shaderTexture.Sample(SampleType, input.tex);

//從紋理圖中得到alpha值

float alpha = shaderTexture.Sample(SampleType, input.tex).a;

//如果alpha小于0.25就放棄掉目前的像素

clip(alpha-0.25);

程式執行後的效果如下:

Directx11教程(46) alpha blend(3)

     程式運作結果還不錯,但是對于籬笆box,它的背面被剔除掉了,下面我們嘗試在D3DClass中增加關閉、打開cullmode的函數,在渲染box時候,禁止背面剔除。

void D3DClass::EnableBackCullMode(bool b)

    {

    D3D11_RASTERIZER_DESC rasterDesc;

    HRESULT result;

   // 設定光栅化描述,指定多邊形如何被渲染.

    rasterDesc.AntialiasedLineEnable = false;

    if(b)

       rasterDesc.CullMode = D3D11_CULL_BACK;

    else

         rasterDesc.CullMode = D3D11_CULL_NONE;

    rasterDesc.DepthBias = 0;

    rasterDesc.DepthBiasClamp = 0.0f;

    rasterDesc.DepthClipEnable = true;

    rasterDesc.FillMode = D3D11_FILL_SOLID; //D3D11_FILL_SOLID

    rasterDesc.FrontCounterClockwise = false;

    rasterDesc.MultisampleEnable = false;

    rasterDesc.ScissorEnable = false;

    rasterDesc.SlopeScaledDepthBias = 0.0f;

   // 建立光栅化狀态

    result = m_device->CreateRasterizerState(&rasterDesc, &m_rasterState);

    if(FAILED(result))

        {

        HR(result);

        return;

        }

    //設定光栅化狀态,使其生效

    m_deviceContext->RSSetState(m_rasterState);

    }

在GraphicsClass中渲染box時候,我們增加下面的代碼:

//渲染box時候關掉背面剔除

m_D3D->EnableBackCullMode(false);

//用light shader渲染

result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_CubeModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,

    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("wirefence.dds")));

m_D3D->EnableBackCullMode(true);

//打開背面剔除

程式最終的運作效果如下:

Directx11教程(46) alpha blend(3)

完整的代碼請參考:

工程檔案myTutorialD3D11_41

代碼下載下傳:

<a href="http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip">http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip</a>

<a href="http://files.cnblogs.com/mikewolf2002/pictures.zip">http://files.cnblogs.com/mikewolf2002/pictures.zip</a>