Merge branch 'main' into la-fusion-de-l'enfer
This commit is contained in:
@@ -14,6 +14,9 @@ D3DClass::D3DClass()
|
||||
m_depthStencilState = 0;
|
||||
m_depthStencilView = 0;
|
||||
m_rasterState = 0;
|
||||
m_depthDisabledStencilState = 0;
|
||||
m_alphaEnableBlendingState = 0;
|
||||
m_alphaDisableBlendingState = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +49,8 @@ bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hw
|
||||
D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
|
||||
D3D11_RASTERIZER_DESC rasterDesc;
|
||||
float fieldOfView, screenAspect;
|
||||
|
||||
D3D11_DEPTH_STENCIL_DESC depthDisabledStencilDesc;
|
||||
D3D11_BLEND_DESC blendStateDescription;
|
||||
|
||||
// Store the vsync setting.
|
||||
m_vsync_enabled = vsync;
|
||||
@@ -346,6 +350,63 @@ bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hw
|
||||
// Create an orthographic projection matrix for 2D rendering.
|
||||
m_orthoMatrix = XMMatrixOrthographicLH((float)screenWidth, (float)screenHeight, screenNear, screenDepth);
|
||||
|
||||
// Clear the second depth stencil state before setting the parameters.
|
||||
ZeroMemory(&depthDisabledStencilDesc, sizeof(depthDisabledStencilDesc));
|
||||
|
||||
// Now create a second depth stencil state which turns off the Z buffer for 2D rendering. The only difference is
|
||||
// that DepthEnable is set to false, all other parameters are the same as the other depth stencil state.
|
||||
depthDisabledStencilDesc.DepthEnable = false;
|
||||
depthDisabledStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
|
||||
depthDisabledStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
|
||||
depthDisabledStencilDesc.StencilEnable = true;
|
||||
depthDisabledStencilDesc.StencilReadMask = 0xFF;
|
||||
depthDisabledStencilDesc.StencilWriteMask = 0xFF;
|
||||
depthDisabledStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
|
||||
depthDisabledStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
|
||||
depthDisabledStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
|
||||
depthDisabledStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
|
||||
depthDisabledStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
|
||||
depthDisabledStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
|
||||
depthDisabledStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
|
||||
depthDisabledStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
|
||||
|
||||
// Create the state using the device.
|
||||
result = m_device->CreateDepthStencilState(&depthDisabledStencilDesc, &m_depthDisabledStencilState);
|
||||
if (FAILED(result))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Clear the blend state description.
|
||||
ZeroMemory(&blendStateDescription, sizeof(D3D11_BLEND_DESC));
|
||||
|
||||
// Create an alpha enabled blend state description.
|
||||
blendStateDescription.RenderTarget[0].BlendEnable = TRUE;
|
||||
blendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_ONE;
|
||||
blendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
|
||||
blendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
|
||||
blendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
|
||||
blendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
|
||||
blendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
|
||||
blendStateDescription.RenderTarget[0].RenderTargetWriteMask = 0x0f;
|
||||
|
||||
// Create the blend state using the description.
|
||||
result = m_device->CreateBlendState(&blendStateDescription, &m_alphaEnableBlendingState);
|
||||
if (FAILED(result))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Modify the description to create an alpha disabled blend state description.
|
||||
blendStateDescription.RenderTarget[0].BlendEnable = FALSE;
|
||||
|
||||
// Create the blend state using the description.
|
||||
result = m_device->CreateBlendState(&blendStateDescription, &m_alphaDisableBlendingState);
|
||||
if (FAILED(result))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -358,6 +419,24 @@ void D3DClass::Shutdown()
|
||||
m_swapChain->SetFullscreenState(false, NULL);
|
||||
}
|
||||
|
||||
if (m_alphaEnableBlendingState)
|
||||
{
|
||||
m_alphaEnableBlendingState->Release();
|
||||
m_alphaEnableBlendingState = 0;
|
||||
}
|
||||
|
||||
if (m_alphaDisableBlendingState)
|
||||
{
|
||||
m_alphaDisableBlendingState->Release();
|
||||
m_alphaDisableBlendingState = 0;
|
||||
}
|
||||
|
||||
if (m_depthDisabledStencilState)
|
||||
{
|
||||
m_depthDisabledStencilState->Release();
|
||||
m_depthDisabledStencilState = 0;
|
||||
}
|
||||
|
||||
if (m_rasterState)
|
||||
{
|
||||
m_rasterState->Release();
|
||||
@@ -598,4 +677,51 @@ void D3DClass::ResizeSwapChain(int newWidth, int newHeight)
|
||||
m_viewport.Width = static_cast<float>(newWidth);
|
||||
m_viewport.Height = static_cast<float>(newHeight);
|
||||
m_deviceContext->RSSetViewports(1, &m_viewport);
|
||||
}
|
||||
}
|
||||
|
||||
void D3DClass::TurnZBufferOn()
|
||||
{
|
||||
m_deviceContext->OMSetDepthStencilState(m_depthStencilState, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void D3DClass::TurnZBufferOff()
|
||||
{
|
||||
m_deviceContext->OMSetDepthStencilState(m_depthDisabledStencilState, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
void D3DClass::EnableAlphaBlending()
|
||||
{
|
||||
float blendFactor[4];
|
||||
|
||||
|
||||
// Setup the blend factor.
|
||||
blendFactor[0] = 0.0f;
|
||||
blendFactor[1] = 0.0f;
|
||||
blendFactor[2] = 0.0f;
|
||||
blendFactor[3] = 0.0f;
|
||||
|
||||
// Turn on the alpha blending.
|
||||
m_deviceContext->OMSetBlendState(m_alphaEnableBlendingState, blendFactor, 0xffffffff);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void D3DClass::DisableAlphaBlending()
|
||||
{
|
||||
float blendFactor[4];
|
||||
|
||||
|
||||
// Setup the blend factor.
|
||||
blendFactor[0] = 0.0f;
|
||||
blendFactor[1] = 0.0f;
|
||||
blendFactor[2] = 0.0f;
|
||||
blendFactor[3] = 0.0f;
|
||||
|
||||
// Turn off the alpha blending.
|
||||
m_deviceContext->OMSetBlendState(m_alphaDisableBlendingState, blendFactor, 0xffffffff);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user