2017-10-19 36 views
0

Direct3D 백 버퍼 캡처를 수행합니다. 픽셀을 다운로드 할 때 이미지 프레임이 세로축을 따라 뒤집 힙니다. 리소스를 복사하거나 대상을 만들 때 프레임을 뒤집기 위해 D3D를 "알리는"것이 가능합니까? ID3D11Texture2D? 여기Direct3D11 : Flipping ID3D11Texture2D

는 그것을 어떻게 : I 프레임 버퍼에 복사되는 텍스처 이렇게 생성

:

D3D11_TEXTURE2D_DESC description = 
    { 
     desc.BufferDesc.Width, desc.BufferDesc.Height, 1, 1, 
     DXGI_FORMAT_R8G8B8A8_UNORM, 
     { 1, 0 }, // DXGI_SAMPLE_DESC 
     D3D11_USAGE_STAGING,//transder from GPU to CPU 
     0, D3D11_CPU_ACCESS_READ, 0 
    }; 
    D3D11_SUBRESOURCE_DATA data = { buffer, desc.BufferDesc.Width * PIXEL_SIZE, 0 }; 
    device->CreateTexture2D(&description, &data, &pNewTexture); 

다음 각 프레임에 I가 수행

 pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pSurface)); 
    pContext->CopyResource(pNewTexture, pSurface); 
    D3D11_MAPPED_SUBRESOURCE resource; 
    pContext->Map(pNewTexture, 0, D3D11_MAP_READ , 0, &resource); 
    //reading from resource.pData 
    //... 

추신 : 렌더링 파이프 라인에 대한 제어 권한이 없습니다. 나는이 코드로 외부 앱을 연결한다. 또한 루프의 역 복사와 같이 CPU의 픽셀 버퍼를 엉망으로 만들고 싶지 않습니다. 낮은 대기 시간의 복사본이 우선 순위가 높습니다.

업데이트 : 나는 또한이 시도

:

컨텐츠에서 비어있는 프레임이 발생
D3D11_BOX box; 
    box.left = 0; 
    box.right = desc.BufferDesc.Width; 
    box.top = desc.BufferDesc.Height; 
    box.bottom = 0; 
    box.front = 0; 
    box.back = 1; 
    pContext->CopySubresourceRegion(pNewTexture, 0, 0, 0, 0, pSurface, 0, &box); 

.

+0

비 -''void'를 반환하는 함수에서''HRESULT'' 값을 확인하는 것을 잊지 마십시오. 현재 작동하고 있다고 가정합니다. ''SUCCEEDED'',''FAILED'' 또는 [ThrowIfFailed] (https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed)와 같은 것을 사용하십시오. –

+0

@ChuckWalbourn 실제로 모든 방법을하고 있습니다. 단순함을 위해 여기에 버려졌습니다. –

+0

멀티 프로젝트를 기반으로 한 예 : 낡은 프로젝트 : https://github.com/headmax/Cplus/blob/master/Projet4/Main.cpp dunno가 도움이된다면 ... –

답변

0

모든 Direct3D를 매핑 자원 그래서 그냥 복사 역, 주사선별로 주사선을 처리해야합니다

auto ptr = reinterpret_cast<const uint8_t>(resource.pData) 
      + (desc.BufferDesc.Height - 1) * resource.RowPitch; 

for(unsigned int y = 0; y < desc.BufferDesc.Height; ++y) 
{ 
    // do something with the data in ptr 
    // which is desc.BufferDesc.Width * BytesPerPixel(desc.Format) bytes 
    // i.e. DXGI_FORMAT_R8G8B8A8_UNORM would be desc.BufferDesc.Width * 4 
    ptr -= resource.RowPitch; 
} 

Direct3D의 자원 사용 예제를 많이 들어, DirectXTex를 참조하십시오.

+0

옵션이 없습니다. 나는 사본이 매우 빠를 필요가있다. 나는 운전자 또는 GPU 쪽에서 플립을 할 방법을 찾는다. 나는 그 질문에 강조 할 것이다. –

+0

Vs가 뒤집힌 상태로 쿼드를 텍스처로 렌더링 할 수 있습니다 ... –

0

CPUAccessFlags = 0 및 BindFlags = D3D11_BIND_SHADER_RESOURCE로 D3D11_USAGE_DEAFULT로 텍스처를 생성하십시오. CopyResource는 스왑 체인의 백 버퍼를 복사합니다. D3D11_BIND_RENDER_TARGET를 사용해 다른 텍스처를 생성한다. 렌더 타겟으로 설정하고, 픽셀 쉐이더를 설정하고, 첫 번째 텍스처를 사용하여 반전 된 쿼드를 그립니다. 이제 두 번째 텍스처를 현재 사용중인 준비 텍스처에 복사 할 수 있어야합니다. 이것은 CPU를 사용하여 뒤집힌 이미지 데이터를 복사하는 것보다 빠릅니다. 그러나이 솔루션은 GPU에 더 많은 리소스를 필요로하고 설치하기가 어려울 수 있습니다.