Я создаю приложение, которое использует directx для рендеринга изображений через окно захвата win32 с веб-камеры, но я это окно мигает каждый другой кадр. (Кажется, это происходит от directx, очищающего экран от каждого кадра, так как мигающий цвет совпадает с четким цветом)C++ проблескивает при рендеринге элементов directx над win32 camCaptureWindow
Есть ли способ исправить эту проблему? (Я не был в состоянии понять, как обеспечить подачу камеры без использования win32)
И вот мой код проекта:
Windows.cpp:
#include <windows.h>
#include <vfw.h>
#include <wchar.h>
#include "Game.h"
#include "resource.h"
#include "Mouse.h"
LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM);
static KeyboardServer kServ;
static MouseServer mServ;
char szAppName [] = TEXT("Webcam");
HWND camhwnd;
HDC hdc ;
HDC hdcMem;
PAINTSTRUCT ps;
HBITMAP hbm;
RECT rc;
//WinMain -- Main Window
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
HWND hwnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(GetModuleHandle(NULL), IDI_APPLICATION);
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szAppName;
RegisterClass (&wc);
hwnd = CreateWindow (szAppName,szAppName,WS_POPUP | WS_VISIBLE,0,0,1920,1080,0,0,hInstance,0);
ShowWindow (hwnd,SW_SHOW);
UpdateWindow (hwnd);
ShowWindow(camhwnd,SW_SHOW);
SendMessage(camhwnd,WM_CAP_DRIVER_CONNECT,0,0);
SendMessage(camhwnd, WM_CAP_SET_SCALE, true , 0);
SendMessage(camhwnd, WM_CAP_SET_PREVIEWRATE, 66, 0);
SendMessage(camhwnd, WM_CAP_SET_PREVIEW, true , 0);
Game theGame(hwnd,kServ,mServ);
while(msg.message != WM_QUIT) {
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
theGame.Go();
}
}
return msg.wParam;
}
//Main Window Procedure WindowProc
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HINSTANCE hInstance = GetModuleHandle(NULL);
switch (message) {
case WM_CREATE: {
camhwnd = capCreateCaptureWindow ("camera window", WS_CHILD , 0, 0, 1920, 1080, hwnd, 0);
SendMessage(camhwnd,WM_CAP_DRIVER_CONNECT,0,0);
SendMessage(camhwnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
break;
}
case WM_DESTROY: {
SendMessage(camhwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0);
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
Часть игры .cpp:
void Game::Go()
{
gfx.BeginFrame();
ComposeFrame();
gfx.EndFrame();
}
И, наконец, кусок D3DGraphics.cpp:
D3DGraphics::D3DGraphics(HWND hWnd)
{
HRESULT result;
backRect.pBits = NULL;
pDirect3D = Direct3DCreate9(D3D_SDK_VERSION);
assert(pDirect3D != NULL);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
result = pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,&d3dpp,&pDevice);
assert(!FAILED(result));
result = pDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer);
assert(!FAILED(result));
}
void D3DGraphics::BeginFrame()
{
HRESULT result;
result = pDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),0.0f,0);
assert(!FAILED(result));
result = pBackBuffer->LockRect(&backRect,NULL,NULL);
assert(!FAILED(result));
}
void D3DGraphics::EndFrame()
{
HRESULT result;
result = pBackBuffer->UnlockRect();
assert(!FAILED(result));
result = pDevice->Present(NULL,NULL,NULL,NULL);
assert(!FAILED(result));
}