DirectX切割Vertex并仅绘制最后一个调用

时间:2014-12-07 08:42:41

标签: c++ directx draw vertex

这是DirectX中发生的事情:

应该做的是展示其中的5只鸟。它只做一个(最后一个)而且也没有正确。

这就是它应该是什么样子(相同的缓冲区等,但在openGL中完成):

所以任何想法可能会导致什么问题?

我的电话是:

初​​始化:

this->device->QueryInterface(__uuidof(IDXGIDevice), (LPVOID*)&dxgiDevice);

dxgiDevice->GetAdapter(&adapter);

adapter->GetParent(IID_PPV_ARGS(&factory));

ZeroMemory(&swapChainDescription, sizeof(swapChainDescription));
swapChainDescription.BufferDesc.Width = this->description.ResolutionWidth;
swapChainDescription.BufferDesc.Height = this->description.ResolutionHeight;
swapChainDescription.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDescription.BufferDesc.RefreshRate.Numerator = 60;
swapChainDescription.BufferDesc.RefreshRate.Denominator = 1;
swapChainDescription.BufferDesc.Scaling = DXGI_MODE_SCALING_STRETCHED;
swapChainDescription.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
swapChainDescription.SampleDesc.Count = 1;
swapChainDescription.SampleDesc.Quality = 0;
swapChainDescription.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDescription.BufferCount = 1;
swapChainDescription.OutputWindow = this->hwnd;
swapChainDescription.Windowed = !this->window->GetDescription().Fullscreen;
swapChainDescription.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapChainDescription.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
factory->CreateSwapChain(this->device, &swapChainDescription, &this->swapChain);

this->swapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&backBuffer);

this->device->CreateRenderTargetView(backBuffer, NULL, &this->backBufferView);

backBuffer->Release();

ZeroMemory(&depthStencilDescription, sizeof(depthStencilDescription));
depthStencilDescription.Width = this->description.ResolutionWidth;
depthStencilDescription.Height = this->description.ResolutionHeight;
depthStencilDescription.MipLevels = 1;
depthStencilDescription.ArraySize = 1;
depthStencilDescription.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilDescription.SampleDesc.Count = 1;
depthStencilDescription.SampleDesc.Quality = 0;
depthStencilDescription.Usage = D3D10_USAGE_DEFAULT;
depthStencilDescription.BindFlags = D3D10_BIND_DEPTH_STENCIL;
depthStencilDescription.CPUAccessFlags = 0;
depthStencilDescription.MiscFlags = 0;

this->device->CreateTexture2D(&depthStencilDescription, 0, &depthStencilBuffer);

this->device->CreateDepthStencilView(depthStencilBuffer, 0, &this->depthStencilBufferView);

depthStencilBuffer->Release();

viewPort.Width = this->description.ResolutionWidth;
viewPort.Height = this->description.ResolutionHeight;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0;
viewPort.TopLeftY = 0;

this->device->RSSetViewports(1, &viewPort);

D3D10_BLEND_DESC BlendState;
ZeroMemory(&BlendState, sizeof(D3D10_BLEND_DESC));
BlendState.AlphaToCoverageEnable = FALSE;
BlendState.BlendEnable[0] = TRUE;
BlendState.SrcBlend = D3D10_BLEND_SRC_ALPHA;
BlendState.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
BlendState.BlendOp = D3D10_BLEND_OP_ADD;
BlendState.SrcBlendAlpha = D3D10_BLEND_ZERO;
BlendState.DestBlendAlpha = D3D10_BLEND_ZERO;
BlendState.BlendOpAlpha = D3D10_BLEND_OP_ADD;
BlendState.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;

this->device->CreateBlendState(&BlendState, &this->blendState);

每个框架(细分):

 this->device->OMSetBlendState(this->blendState, 0, 0xffffffff);
    this->device->OMSetRenderTargets(1, &this->backBufferView, this->depthStencilBufferView);
    this->device->ClearRenderTargetView(this->backBufferView, &Color.colors[0]);
    this->device->ClearDepthStencilView(this->depthStencilBufferView, D3D10_CLEAR_DEPTH | 
D3D10_CLEAR_STENCIL, 1.0f, 0);

in for循环(5次):

   ID3D10Buffer* buff = (ID3D10Buffer*)buffer->GetData();

            UINT stride = buffer->GetStride();
            UINT offset = 0;

            this->device->IASetVertexBuffers(0, 1, &buff, &stride, &offset);

            ID3D10Buffer* buff = (ID3D10Buffer*)buffer->GetData();

            this->device->IASetIndexBuffer(buff, DXGI_FORMAT_R32_UINT, 0);

            this->device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

            this->device->DrawIndexed(Indexes, 0, 0);

在结束

 this->swapChain->Present(0, 0);

1 个答案:

答案 0 :(得分:0)

我得到了修复,其他人在这里:

削减顶点:

我的近/远飞机彼此靠近。 (他们是0.1f和100.0f)改变了两个值,现在他们工作了。

DirectX仅绘制最后一次通话:

必须为每个模型再次申请材料。

这样做

// Set coresponding input layout
this->device->IASetInputLayout(this->inputLayout);

// Apply specified pass of current technique
this->technique->GetPassByIndex(0)->Apply(0);