現在我們嘗試改變box的貼圖,使用一張帶alpha的dds檔案wirefence.dds,
用directx texture tool打開檔案界面如下:
實際上,這幅圖中一些像素有alpha值,一些像素alpha值為0,我們點選View-alpha channel only,可以看到下面的圖,其中黑色部分的alpha值為0:
現在我們把這幅圖貼到box上,程式運作效果如下:
我們在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);
程式執行後的效果如下:
程式運作結果還不錯,但是對于籬笆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);
//打開背面剔除
程式最終的運作效果如下:
完整的代碼請參考:
工程檔案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>