2012-05-05 2 views
1

: http://www.ring3circus.com/gameprogramming/case-study-fraps/ 을하고 나는이 정말 잘못되고 있음을, 그것이 얼마나 오래된 부여 (그리고 저자는 심지어 자신의 코드를 사용에 대한 제안) 실현 왔어요 스위트 룸에 들어갈 필요가 없습니다 (하나, C#, 둘, DX9 용). DirectX 게임 창을 사각형으로 캡처하고 참조 할 수있는 일종의 스트리밍 비디오 메모리로 가져 오려고합니다. 창은 전경이 보이지 않거나 보이지 않는 경우 (다른 창 뒤에 묻혀있을 때) 캡처 할 수 있어야합니다. C# 라이브러리 (EasyHook 및 SlimDX로 만든 라이브러리)를 사용해 보았지만 64 비트에서 DirectX 11 게임을 사용하여 한 번만 성공적으로 작업 할 수있었습니다 (그 이후로는 재현 할 수 없었습니다). 그 당시에도 포착률은 눈을 피로하게 느리게 나타났습니다. DirectX에 오버레이를 적용하는 많은 다른 것들과 함께 (필자는 필요하지 않음). 캡쳐가 될 때까지는 무엇을하는지 모방하고 싶습니다만, 모든 부분이 아닌 사각형 영역이 필요합니다. 파일에 쓰지 않아도됩니다. DX9 트로프 DX11에서 작동하는 C#의 게임 창의 주어진 사각형의 빠른 프레임 캡처를 관리하는 방법에 대한 코드 샘플을 얻을 수 있습니까?DX9 캡처 C#을 나는이 arcile 읽고 있었다

+1

이것은 좋은 질문이다. DX9와 다른 관련없는 솔루션 아래에 묻혀있는 인터넷에서 쉽게 답변을 찾을 수 있습니다. – jheriko

답변

3

다음은 동일한 문제에 대한 내 C++ 코드입니다.

ID3D11Texture2D* pSurface; 
HRESULT hr = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast< void** >(&pSurface)); 
if(pSurface) 
{ 
    const int width = static_cast<int>(m_window->Bounds.Width * m_dpi/96.0f); 
    const int height = static_cast<int>(m_window->Bounds.Height * m_dpi/96.0f); 
    unsigned int size = width * height; 
    if(m_captureData) 
    { 
     freeFramebufferData(m_captureData); 
    } 
    m_captureData = new unsigned char[ width * height * 4 ]; 

    ID3D11Texture2D* pNewTexture = NULL; 

    D3D11_TEXTURE2D_DESC description; 
    pSurface->GetDesc(&description); 
    description.BindFlags = 0; 
    description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
    description.Usage = D3D11_USAGE_STAGING; 

    HRESULT hr = m_d3dDevice->CreateTexture2D(&description, NULL, &pNewTexture); 
    if(pNewTexture) 
    { 
     m_d3dContext->CopyResource(pNewTexture, pSurface); 
     D3D11_MAPPED_SUBRESOURCE resource; 
     unsigned int subresource = D3D11CalcSubresource(0, 0, 0); 
     HRESULT hr = m_d3dContext->Map(pNewTexture, subresource, D3D11_MAP_READ_WRITE, 0, &resource); 
     //resource.pData; // TEXTURE DATA IS HERE 

     const int pitch = width << 2; 
     const unsigned char* source = static_cast< const unsigned char* >(resource.pData); 
     unsigned char* dest = m_captureData; 
     for(int i = 0; i < height; ++i) 
     { 
      memcpy(dest, source, width * 4); 
      source += pitch; 
      dest += pitch; 
     } 

     m_captureSize = size; 
     m_captureWidth = width; 
     m_captureHeight = height; 

     return; 
    } 

    freeFramebufferData(m_captureData); 
} 

이걸 C#으로 이식하거나 적어도 라이브러리로 포장 할 수 있습니다. 나는 비슷한 질문을했지만 대답을 찾았다. DirectX 11 framebuffer capture (C++, no Win32 or D3DX)

+1

스왑 체인을 어떻게 초기화합니까? 이 코드를 사용하여 다른 응용 프로그램의 화면을 잡을 수 있습니까? – Cesar

+0

좋은 출발점은 정말 올바른 방향을 찾는데 도움이되었습니다. – Hydra

관련 문제