2016-06-20 6 views
0

투명 배경을 가진 png 파일이 있습니다.DirectX 11 투명성 문제

이미지를 그릴 때 투명도가 적용됩니다.

enter image description here

만큼 아래와 같이 앞의 다른 투명한 화상이 없기 때문에. 이 문제를 해결하기 위해

enter image description here

어떤 변화가 내 투명성 코드를해야합니까?

깊이 스텐실 코드 :

// Initialize the description of the depth buffer. 
ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc)); 

// Set up the description of the depth buffer. 
depthBufferDesc.Width = screenWidth; 
depthBufferDesc.Height = screenHeight; 
depthBufferDesc.MipLevels = 1; 
depthBufferDesc.ArraySize = 1; 
depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 
depthBufferDesc.SampleDesc.Count = 1; 
depthBufferDesc.SampleDesc.Quality = 0; 
depthBufferDesc.Usage = D3D11_USAGE_DEFAULT; 
depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; 
depthBufferDesc.CPUAccessFlags = 0; 
depthBufferDesc.MiscFlags = 0; 

// Create the texture for the depth buffer using the filled out description. 
result = m_device->CreateTexture2D(&depthBufferDesc, NULL, &m_depthStencilBuffer); 
Error::ErrorCheck(result, TEXT("m_device->CreateTexture2D()")); 

// Initialize the description of the stencil state. 
ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc)); 

// Set up the description of the stencil state. 
depthStencilDesc.DepthEnable = true; 
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; 
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS; 

depthStencilDesc.StencilEnable = true; 
depthStencilDesc.StencilReadMask = 0xFF; 
depthStencilDesc.StencilWriteMask = 0xFF; 

// Stencil operations if pixel is front-facing. 
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; 
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR; 
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; 
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; 

// Stencil operations if pixel is back-facing. 
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; 
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR; 
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; 
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; 

// Create the depth stencil state. 
result = m_device->CreateDepthStencilState(&depthStencilDesc, &m_depthStencilState); 
Error::ErrorCheck(result, TEXT("m_device->CreateDepthStencilState()")); 

// Set the depth stencil state. 
m_deviceContext->OMSetDepthStencilState(m_depthStencilState, 0); 

// Initailze the depth stencil view. 
ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc)); 

// Set up the depth stencil view description. 
depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; 
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 
depthStencilViewDesc.Texture2D.MipSlice = 0; 

// Create the depth stencil view. 
result = m_device->CreateDepthStencilView(m_depthStencilBuffer, &depthStencilViewDesc, &m_depthStencilView); 
Error::ErrorCheck(result, TEXT("m_device->CreateDepthStencilView()")); 

// Bind the render target view and depth stencil buffer to the output render pipeline. 
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView); 

투명성 코드 :

//Setup Blend State for transperency 
D3D11_BLEND_DESC BlendStateDescription; 
ZeroMemory(&BlendStateDescription, sizeof(D3D11_BLEND_DESC)); 

ID3D11BlendState* blend; 

BlendStateDescription.RenderTarget[0].BlendEnable = TRUE; 
BlendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; 
BlendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; 

BlendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; 
BlendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_DEST_ALPHA; 
BlendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; 
BlendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; 
BlendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; 

m_device->CreateBlendState(&BlendStateDescription, &blend); 
float blendFactor[] = { 0, 0, 0, 0 }; 
UINT sampleMask = 0xffffffff; 

m_deviceContext->OMSetBlendState(blend, blendFactor, sampleMask); 
+0

는 당신에게 투명성이 첫 번째 경우에 작동하는지 위치 :

더 자세한 설명은 링크를 따라, 여기에 답을 발견하셨습니까? PNG의 투명한 부분이 선명한 색상 (둘 다 흰색 임)과 일치하는 경우 일 수 있습니다. – Columbo

+0

배경이 바뀌면 이미지가 여전히 투명합니다. :) – Oblivion

+0

깊이 버퍼가 있습니까? 쓰고 깊이 스텐실 상태로 테스트합니까? – galop1n

답변

0

문제를 발견. 깊이 버퍼에 있었어. depthStencilDesc.DepthFunc를 D3D11_COMPARISON_LESS에서 D3D11_COMPARISON_LESS_EQUAL로 간단하게 변경하십시오. Detailed answer

+2

문제는 깊이 버퍼 상태가 아닙니다. 문제는 투명도를 렌더링 할 때 깊이 버퍼를 수정한다는 것입니다. 'LESS_EQUAL'로 전환하면 즉각적인 문제가 해결되었을 수도 있지만, 대역폭을 낭비하고 같은 비행기에서 평평한 이미지를 렌더링하는 것보다 더 흥미로운 일을하려고하면 더 많은 문제가 발생할 것입니다. 권장 사항에 링크 된 대답에 따라 깊이를 완전히 없애고 투명 오브젝트를 맨 앞으로 렌더링해야합니다. – MooseBoys

+0

설명해 주셔서 감사합니다. 왜 깊이 버퍼를 사용할 수 없어야하는지 이해합니다. 하지만 100 % 확실하지 않은 말은 "투명한 물체를 앞쪽으로 렌더링"이라고 말하면됩니다. 더 자세히 설명해 주시면 이해할 수 있습니까? – Oblivion

+0

투명한 오브젝트를 단일 렌더 타겟에 올바르게 렌더링하는 유일한 방법은 카메라에 대해 가장 멀리 떨어져있는 (즉, 뷰포트에 대해 앞뒤로) 가장 가까운 것부터 가장 가까운 것부터 렌더링하는 것입니다. 순서에 독립적 인 투명성과 같은 고급 기술이 있지만 일반적으로 추가 중간 버퍼가 필요합니다. – MooseBoys