2011-02-14 6 views
3

먼저 일반적인 상황 ... DLL을 통해로드 된 타사 라이브러리가 HWND로 렌더링됩니다. 그것은 단순한 2D 렌더링이며 D3D를 직접 볼 수있는 방식으로 사용하지 않습니다. DLL에 대한 종속성 워크는 D3DKMTCreateDevice과 같은 D3DKMT 함수를 많이 나타내지 만 일반 D3D 호출은 IDirect3D9::CreateDevice과 같지 않습니다. IDirect3D9::CreateDevice으로 전화하면 제 3 자 렌더링이 엉망이됩니다. 그것은 불평하지 않지만 단순히 모든 것을 검은 색 직사각형으로 만듭니다. 내 자신의 렌더링 잘 작동합니다.D3D9를 초기화하면 타사 라이브러리가 작동을 멈 춥니 다.

제 3 자 DLL은 wxWidgets wxWebConnect 라이브러리에 래핑 된 FireFox (하드웨어 가속 기능이있는 2.0이 아님)의 핵심 인 Mozilla XULRunner 1.9.x입니다. wxWC는 XUL DLL을로드하고 웹 브라우저 GUI 구성 요소를 제공합니다.

내가 여기 WX & wxWebConnect를 사용하여 작동하는 응용 프로그램이 컴파일 된 EXE 및 코드 : 여기 http://www.kirix.com/forums/viewtopic.php?f=25&t=911#p2605

는 약간 wxWidgets에 결합하지만 읽기 힘든 만들 충분하지 않아, 내 실제 코드 - 나는 HWND가 임의의 창에서 얻을 단순히 D3D를 초기화 만에 렌더링 결코합니다 :

void MyFrame::OnD3DButton(wxCommandEvent &event) 
{ 
    static bool initialized = false; 
    static LPDIRECT3D9 mpD3D = NULL; 
    static LPDIRECT3DDEVICE9 mpD3DDevice=NULL; 
    if(!initialized) 
    { 
     wxButton *button=wxDynamicCast(event.GetEventObject(), wxButton); 
     HWND mHWnd = (HWND)button->GetHandle(); 
     mpD3D = Direct3DCreate9(D3D_SDK_VERSION); 

     D3DPRESENT_PARAMETERS md3dpp; 
     ZeroMemory(&md3dpp, sizeof(D3DPRESENT_PARAMETERS)); 
     md3dpp.Windowed     = true; 
     md3dpp.SwapEffect    = D3DSWAPEFFECT_DISCARD; 
     // triple buffer if VSync is on 
     md3dpp.BackBufferCount   = 1; 
     md3dpp.EnableAutoDepthStencil = 0; 
     md3dpp.hDeviceWindow   = mHWnd; 
     md3dpp.BackBufferWidth   = 0; 
     md3dpp.BackBufferHeight   = 0; 
     md3dpp.FullScreen_RefreshRateInHz = 0; 
     md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 
     md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
     md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 
     md3dpp.MultiSampleQuality = 0; 

     HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd, 
      D3DCREATE_MULTITHREADED|D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice); 
     if(FAILED(hr)) 
      wxMessageBox(wxString("mpD3D->CreateDevice() FAILED")); 
     else 
     { 
      wxMessageBox(wxString("mpD3D->CreateDevice() SUCCEEDED")); 
      initialized = true; 
     } 
    } 

} 

답변

5

D3DCREATE_FPU_PRESERVE 플래그를 전달하지 않으면 CreateDevice가 FPU 상태를 수정하는 것이 문제 일 수 있습니다. 그것이 나를 깨울 때 이것을 발견하는 데 정말 오랜 시간이 걸렸습니다.

+0

이것은 대부분 문제 일 수 있습니다. 그 고통의 고통. – Goz

+0

오 세상에, 나는 이것을 단지 목록에서 벗어나서 시도해 보았습니다! 나는 지구상에서 웹 렌더링 엔진을 망칠 이유가 없다는 것을 알지 못합니다. 이제이 정보로 무엇을해야합니까? –

+0

이유는 부동 소수점 산술을 사용하는 모든 것을 망칠 것이기 때문입니다. – erikkallen

1

당신은 제 3 자 dll을 사용하는 것과 같은 동일한 HWND와 D3D 장치를 만들려면 어떻게해야합니까?

이 경우에는 타사 소프트웨어가 여전히 그려지지만 direct3d는 그 위에 렌더링되므로 d3d 출력 만 볼 수 있습니다.

+0

아니요, 별개입니다. 또한 _any_ 렌더링을 수행하지 않습니다. 내가 호출 한 것은'Direct3DCreate9'와'CreateDevice'입니다. –

+0

어떻게 장치를 만드십니까? 매개 변수를 게시 할 수 있습니까? 당신은 디버그를합니까? 어쩌면 로그에 createdevice에 문제가 있음을 나타내는 무언가가 있습니다. – cppanda

+0

WindowsXP, Vista 또는 7을 사용하고 있습니까 ?? D3D9 장치 또는 D3D9EX 장치를 만들고 있습니까? – zezba9000

관련 문제