2011-05-12 10 views
6

GDI와 D3D11을 사용하여 텍스처에 텍스트를 그릴 때 도움이 필요합니다. 나는 D2D/DirectWrite를 사용해 보았지만, 필요에 따라 D3D10 만 지원하고 D3D11은 지원하지 않습니다. 내가 시도한 모든 것이 지금까지 실패했습니다 ... 이제 GDI 메서드를 사용하여 텍스처를 작성하고 싶습니다. D3D11 : GXDI 표면에 GDI 텍스트를 그리는 방법? (D2D없이)

Usage = D3D11_USAGE_DEFAULT; 
Format = DXGI_FORMAT_B8G8R8A8_UNORM; 
BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; 
CPUAccessFlags = 0; 
MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE 

그럼 내가 여기에 마이크로 소프트 SAIS 등이 질감에서 정상 RenderTargetView을 만들어 :이 PARAMS와 그래서 나는 질감을 만들어 http://msdn.microsoft.com/en-us/library/ff476203%28v=vs.85%29.aspx

다음 단계 :

m_pTexFSText->QueryInterface(__uuidof(IDXGISurface1), (void **)(&m_pDXGISurface)); 
다음 DXGI 인터페이스를 가져옵니다

렌더링 기능에서 나는 단지 다음과 같습니다 :

m_pDeviceContext->OMSetRenderTargets(1,&m_pTextRenderTarget,NULL); 

HDC hDc = NULL; 
if(FAILED(m_pDXGISurface->GetDC(TRUE,&hDc))) 
    return E_FAIL; 

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7); 

if(FAILED(m_pDXGISurface->ReleaseDC(NULL))) 
    return E_FAIL; 

문제는 GDI 드로잉 후에 텍스처가 여전히 비어 있다는 것입니다 (또한 PIX로 테스트 됨). 모든 것이 작동하며 오류 메시지가 없습니다.

아무도 작동 원리를 설명 할 수 있기를 바랍니다.

감사합니다, 스테판

편집 : (설명서에 따라) GetDC(FALSE,&hDc)과 또한 그것을 시도하지 : 동일한 결과 -> 아무것도.

+0

'DXGI_FORMAT_R8G8B8A8_UINT' 형식을 사용해 보셨습니까? GDI 호환 질감 위의 링크에 다큐에 따라 – Necrolis

+0

특별한 형식이 "당신은 다음과 같은 유형 중 하나에 질감 형식을 설정해야합니다 DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_TYPELESS, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB"필요 – sandicz

답변

3

어쩌면 당신은 모든 것을 잘하고있을 것입니다. 그것은 단지 텍스트 그림이 당신이 기대하는 것을하지 않는 것입니까? 나는이에서 이해하지

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
bool hmm = TextOutA(hDc, 10, 10, "LALALA!", 7); 

은 어떻게 TextOutAbla이 텍스트 색으로 사용되어야한다는 것을 추측 할 것으로 예상 않습니다. AFAIK 새로 생성/획득 된 DC에서 사용 된 기본 텍스트 색은 검은 색입니다. 배경 채우기 모드에 대해서는 확신 할 수 없지만 기본적으로 인 경우 - 그리기가 전혀없는 이유를 완전히 설명합니다.

나는 다음에 코드를 변경 것 :

COLORREF bla = SetPixel(hDc,1,1,RGB(255,255,255)); 
VERIFY(SetTextColor(hDc, bla) != CLR_INVALID); 

CREct rc(0, 0, 30, 20); // put relevant coordinates 
VERIFY(ExtTextOut(hDc, rc.left, rc.top, ETO_CLIPPED, &rc, "LALALA!", 7)); 
+0

안녕하세요,이 라인은 시험입니다. 1,1에서 픽셀을 흰색으로 설정하고 두 번째로 데모 텍스트를 작성하십시오. 나는 당신의 버전을 시도 할 것입니다. 감사합니다 :) – sandicz

+0

그냥 그 GetCH() 함수에 대한 오류 메시지를 가져 오는 인스턴트 메신저 : "Microsoft C++ 예외 : _com_error 메모리 위치에 0x0018f760"(영어 번역). 나는 이것이 실제로 일어나는 이유를 정말로 상상할 수 없다. 어쩌면 이것은 주요 문제이며 GDI가 아닙니다. DirectWrite가 D3D11을 지원할 때까지 기다려야하는 것처럼 보입니다. – sandicz

+0

반환 값/예외를 확인하는 것이 좋습니다. 특히 뭔가 잘못되었을 때 특히 유용합니다. :) – valdo

4

사실은 지난 주 동안이 문제를 많이 싸웠다 - 그러나 나는 모든 작업있어! 여기에 당신이 알아야 할 것들의 목록입니다/그것을 모든 작업을 만들기 위해 할 : 마음 경우에 다음 http://msdn.microsoft.com/en-us/library/windows/desktop/ff471345(v=vs.85).aspx

유지하십시오의 GetDC 방법에 대한 표면 요구 사항이 여기서 일하고

  • 확인

    • 서페이스에 D3D11_RESOURCE_MISC_GDI_COMPATIBLE 플래그를 사용하거나 스왑 체인에 DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE 플래그를 사용하여 서페이스를 만들어야합니다. 그렇지 않으면이 메서드가 실패합니다.

    • 새 Direct3D 명령을 실행하기 전에 장치를 릴리스하고 IDXGISurface1 :: ReleaseDC 메서드를 호출해야합니다.

    ?이 메서드는 해결되지 않은 DC가 이미 만들어져 있으면이 메서드는 실패합니다.

    • 표면 또는 스왑 체인의 형식은 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 또는 DXGI_FORMAT_B8G8R8A8_UNORM이어야합니다.

    ? GetDC에서 Direct3D 파이프 라인의 출력 합병에서 렌더링 대상이 표면에서 언 바운드됩니다. GDI 렌더링 후에 Direct3D 렌더링 전에 장치에서 ID3D11DeviceContext :: OMSetRenderTargets 메서드를 호출해야합니다.

    • 버퍼 크기를 조정하기 전에 모든 미해결 DC를 해제해야합니다. 당신이 백 버퍼에서 사용할 거라면

  • , 다시 바인드 기억이 ReleaseDC를 호출하기 후 대상 을 렌더링합니다. 이 메서드는 GetDC를 호출하기 전에 RT를 수동으로 바인딩 해제하는 것은 필요하지 않습니다.

  • Direct3D 드로잉은 GetDC()와 ReleaseDC() 호출 간에는 사용할 수 없습니다. 표면이 GDI 용 DXGI에 의해 잠정적으로 잠겨 있기 때문입니다. 그러나 D3D로 이동하기 전에 GDI를 사용해야 할 때마다 GetDC()/ReleaseDC()를 호출하면 GDI와 D3D 렌더링을 혼합 할 수 있습니다.

  • 수도 쉽게 들리 겠지만, 당신이 개발자가이 문제에 빠질 얼마나 많은 놀랠 것이 마지막 비트 - 당신이 백 버퍼에 GDI 그릴 때, 이것은 다시 버퍼가 아닌 프레임 버퍼 있음을 유의 그래서 실제로 무엇을 그려 왔는지 보려면 RT를 OM에 다시 바인딩하고 swapChain-> Present() 메서드를 호출하여 백 버퍼가 프레임 버퍼가되고 그 내용이 화면에 표시되도록해야합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 정말 유용하게 들리 겠지만 어쩌면 문제가 내 코드에서 어디에 있는지 알 수 있습니다 (DC를 릴리스하고 Rendertarget을 다시 바인딩). 불행히도 지금은 당신의 견해를 시험 할 시간이 없지만, 앞으로는 ... – sandicz

관련 문제