Pergunta

Como podemos copiar um arbitrário poligonal região de um Direct3D 11 textura 2D para outra textura?Tentei usar ID3D11DeviceContext::CopySubresourceRegion Método, mas apenas cópias retangulares partes.Eu uso o Visual C++.

pKeyedMutex11->AcquireSync(1, INFINITE);
pImmediateContext->CopySubresourceRegion( pBackBuffer11, 0, max(size.width-turned,0.0f), 0, 0, pSharedTexture11, 0, &sourceRegion );            
pKeyedMutex11->ReleaseSync(0);

pKeyedMutex11_2->AcquireSync(1, INFINITE);
pImmediateContext->CopySubresourceRegion( pBackBuffer11, 0, max(size_1.width - 2*turned,0.0f) , 0, 0, pSharedTexture11_2, 0, &sourceRegion_2 );         
pKeyedMutex11_2->ReleaseSync(0);

pKeyedMutex11_1->AcquireSync(1, INFINITE);
        // Copy the content from the shared texture to the back-buffer          
pImmediateContext->CopySubresourceRegion( pBackBuffer11, 0, 0, 0, 0, pSharedTexture11_1, 0, &sourceRegion_1 );
pKeyedMutex11_1->ReleaseSync(0);

editar:Adicionado o snippet de código.

Foi útil?

Solução

Eu não sei se existe um método direto para copiar uma região poligonal.Mas você pode usar um stencil buffer.Desenhar o polígono arbitrário para o stencil buffer.E cópia de toda a textura para outro através da aplicação do estêncil.Você poderia obter o mesmo efeito.

EDIÇÃO ::Citação Adicionados

Você pode ter um olhar para este tutorial.http://www.rastertek.com/dx11tut03.html

Agora precisamos configurar a profundidade estêncil descrição.Isso nos permite controlar o tipo de profundidade testar Direct3D vai fazer para cada pixel.

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

Com a descrição preenchido podemos, agora, criar uma profundidade de estêncil estado.

// Create the depth stencil state.
result = m_device->CreateDepthStencilState(&depthStencilDesc, &m_depthStencilState);
if(FAILED(result))
{
    return false;
}

Com o criado de profundidade estêncil estado, podemos agora defini-lo para que ele tenha efeito.Observe que usar o contexto de dispositivo para o definir.

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

A próxima coisa de que precisamos para criar é a descrição de vista da profundidade de stencil buffer.Nós fazemos isso para que o Direct3D sabe usar o buffer de profundidade, como uma profundidade de estêncil textura.Após o preenchimento da descrição que, em seguida, chamar a função CreateDepthStencilView para criá-lo.

// 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);
if(FAILED(result))
{
    return false;
}

Com que criou podemos agora chamar OMSetRenderTargets.Isto irá ligar o destino de processamento de vista e a profundidade de stencil buffer para a saída do pipeline de renderização.Desta forma, os gráficos que o pipeline compõe vai ter elaborado para a memória intermédia que previamente criado.Com os gráficos escrito para o buffer de fundo podemos, então, trocá-lo para a frente e apresentar os nossos gráficos na tela do usuário.

// Bind the render target view and depth stencil buffer to the output render pipeline.
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top