2016-06-20 17 views
0

Ich habe eine PNG-Datei mit einem transparenten Hintergrund.DirectX 11 Transparenz Problem

Wenn ich das Bild zeichnen, funktioniert die Transparenz.

enter image description here

solange es vor ihm kein anderes transparentes Bild ist, wie unten zu sehen.

enter image description here

Welche Änderungen muss ich meine Transparenz Code machen, dieses Problem zu lösen? Schablonencode

Tiefe:

// 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); 

Transparency Code:

//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

Sind Sie sicher, dass die Transparenz im ersten Fall funktioniert? Es könnte der Fall sein, dass die transparenten Teile des Png zu Ihrer klaren Farbe passen (sie sind beide weiß). – Columbo

+0

Ich bin, wenn ich den Hintergrund ändere das Bild ist immer noch transparent :) – Oblivion

+0

Hat vielleicht einen Tiefenpuffer, schreiben Sie es und testen Sie es in Ihrer Tiefe Schablone Zustände? – galop1n

Antwort

0

das Problem gefunden. War im Tiefenpuffer. Nur eine einfache Änderung depthStencilDesc.DepthFunc von D3D11_COMPARISON_LESS zu D3D11_COMPARISON_LESS_EQUAL.

hier die Antwort gefunden, auf den Link, um weitere detaillierte Beschreibung: Detailed answer

+2

Das Problem ist nicht der Tiefenpufferzustand; Das Problem ist, dass Sie den Tiefenpuffer beim Rendern von Transparenz ändern. Wenn Sie zu "LESS_EQUAL" wechseln, haben Sie zwar Ihr momentanes Problem gelöst, aber Sie verschwenden Bandbreite und stoßen wahrscheinlich auf weitere Probleme, wenn Sie versuchen, etwas Interessanteres zu tun, als flache Bilder in derselben Ebene zu rendern. Da die Antwort, die Sie mit recommends verknüpfen, empfohlen wird, sollten Sie die Tiefe wahrscheinlich ganz abschalten und transparente Objekte nach vorne rendern. – MooseBoys

+0

Danke für die Klärung. Macht Sinn, warum ich keinen Tiefenpuffer aktiviert haben sollte. Aber ich bin nicht 100% sicher, was du meinst, wenn du sagst "render transparente Objekte zurück nach vorne". Kannst du das genauer erklären, damit ich es verstehe? – Oblivion

+0

Die einzige Möglichkeit, transparente Objekte für ein einzelnes Renderziel korrekt zu rendern, besteht darin, sie von der am weitesten entfernten relativen Position zur Kamera (d. H. Von hinten nach vorne relativ zum Ansichtsfenster) zu zeichnen. Es gibt fortgeschrittene Techniken, wie zum Beispiel eine Reihenfolge-unabhängige Transparenz, aber sie erfordern normalerweise zusätzliche Zwischenpuffer. – MooseBoys