我正在添加对dx11的支持,但遇到了一些问题。在没有深度缓冲区视图的情况下,它可以很好地呈现,但是当我附加它时,我的三角形被隐藏了,并且我只能看到一个空白屏幕。在调试器中,三角形的深度为0.5。它不应该被淘汰。但是它在管道中可见。视口的最小/最大深度为0/1,附加并清除了深度。我不知道为什么我只有一个空白的空白屏幕。
device_->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer_);
pBackBuffer->Release();
unsigned int width, height;
window_->getWindowSize(width, height);
D3D11_TEXTURE2D_DESC depth_stencil_desc;
depth_stencil_desc.Width = width;
depth_stencil_desc.Height = height;
depth_stencil_desc.MipLevels = 1;
depth_stencil_desc.ArraySize = 1;
depth_stencil_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depth_stencil_desc.SampleDesc.Count = 1;
depth_stencil_desc.SampleDesc.Quality = 0;
depth_stencil_desc.Usage = D3D11_USAGE_DEFAULT;
depth_stencil_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depth_stencil_desc.CPUAccessFlags = 0;
depth_stencil_desc.MiscFlags = 0;
//Create the Depth/Stencil View
if (device_->CreateTexture2D(&depth_stencil_desc, NULL, &depth_stencil_buffer_) < 0)
throw std::runtime_error("DirectX: Could not CreateTexture2D!");
if (device_->CreateDepthStencilView(depth_stencil_buffer_, NULL, &depth_stencil_view_) < 0)
throw std::runtime_error("DirectX: Could not CreateDepthStencilView!");
// set the render target as the back buffer
device_context_->OMSetRenderTargets(1, &backbuffer_, depth_stencil_view_);
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = 800;
viewport.Height = 600;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
device_context_->RSSetViewports(1, &viewport);
// Loop {
// Bind shader
float col[4] = { 0.0f, 0.2f, 0.4f, 1.0f };
device_context_->ClearRenderTargetView(backbuffer_, col);
device_context_->ClearDepthStencilView(depth_stencil_view_, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
// Bind vertex buffer, constant buffer, texture
device_context_->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
device_context_->Draw(count, base);
swap_chain_->Present(0, 0);
// End Loop
我已经提供了可能会有所帮助的“深度模板”创建代码。但是看起来它们可能是您可以尝试的一些参数差异。仅当您需要读回深度模板时才需要着色器资源绑定标志。此代码在C#和Sharpdx中,仅供参考。
D3D11.Texture2DDescription desc = new D3D11.Texture2DDescription()
{
Format = DXGI.Format.R32_Typeless,
ArraySize = 1,
MipLevels = 0,
Width = _textureWidth,
Height = _textureHeight,
Usage = D3D11.ResourceUsage.Default,
SampleDescription = new DXGI.SampleDescription(1, 0),
BindFlags = D3D11.BindFlags.DepthStencil | D3D11.BindFlags.ShaderResource,
CpuAccessFlags = D3D11.CpuAccessFlags.None,
OptionFlags = D3D11.ResourceOptionFlags.None
};
D3D11.Texture2D depthBuffer = new D3D11.Texture2D(d3dDevice_, desc);
// Depth Buffer
D3D11.DepthStencilViewDescription stencilBufferViewDesc = new D3D11.DepthStencilViewDescription()
{
Dimension = D3D11.DepthStencilViewDimension.Texture2D,
Format = DXGI.Format.D32_Float,
Flags = D3D11.DepthStencilViewFlags.None,
Texture2D = new D3D11.DepthStencilViewDescription.Texture2DResource() { MipSlice = 0 },
};
_depthStencilView = new D3D11.DepthStencilView(d3dDevice_, depthBuffer, stencilBufferViewDesc)
{
DebugName = "Shadow Map Depth Buffer Stencil View"
};