В настоящее время я работаю над проектом, и мне нужно отобразить 3D-изображение, используя изображения, снятые с помощью 3D-камеры Bumblebee2. Я работаю на компьютере MSI AE2420, на котором установлен AMD HD 5730 с поддержкой 3D. У меня также есть затворное стекло. для просмотра изображений в стереорежиме.
Я использую библиотеки DirectX 9 (d3dx9.h). IDE - это VS 2008 Express Edition.
У меня есть образцы изображений (слева и справа), и я импортировал их в программу последовательно с линиями;
pDevice->CreateOffscreenPlainSurface(IMAGE_WIDTH,IMAGE_HEIGHT,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&leftImageBuffer,NULL);
pDevice->CreateOffscreenPlainSurface(IMAGE_WIDTH,IMAGE_HEIGHT,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&rightImageBuffer,NULL);
D3DXLoadSurfaceFromFile(leftImageBuffer,NULL,NULL,"left0000.bmp",NULL,D3DX_FILTER_NONE,0,NULL)
D3DXLoadSurfaceFromFile(rightImageBuffer,NULL,NULL,"right0000.bmp",NULL,D3DX_FILTER_NONE,0,NULL)
После некоторых исследований я обнаружил, что Direct3D9 не поддерживает активный стереофонический буфер с четырьмя буферами. Поэтому я не могу использовать четыре буфера (левый передний, левый задний, правый передний, правый задний). Вот где задействован AMD Quad Buffer SDK. Они указывают, что DirectX 9 не разрешайте активное стерео, а мне нужно использовать функции SDK. Я использую «AtiDx9Stereo.h», который является одним из шести файлов заголовков в SDK (остальные пять предназначены для DirectX 11 и DirectX10).
Однако после долгого кодирования и тестирования мне наконец удалось включить стерео, и теперь я вижу левое изображение на левой стороне стекла затвора, но на правой стороне стекла я ничего не вижу. справа я вижу только левое изображение. Когда я закрываю левый глаз, я вижу только черную страницу (или синюю после очистки цели рендеринга до синего или другого цвета). Вот мой код рендеринга и инициализация указателей. Если кто-то работал с этой средой, было бы здорово поделиться некоторыми знаниями.
Операторы инициализации
pD3D=Direct3DCreate9(D3D_SDK_VERSION);
pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWindow,64,&d3pp,&pDevice);
pDevice->CreateOffscreenPlainSurface(10,10,(D3DFORMAT)FOURCC_AQBS,D3DPOOL_DEFAULT,&driverCommSurface,NULL);
SendStereoCommand(ATI_STEREO_ENABLESTEREO, NULL, 0, 0, 0);
SendStereoCommand(ATI_STEREO_GETLINEOFFSET, (BYTE *)(&lineOffset), sizeof(DWORD), 0, 0);
После этих утверждений моя функция render() выглядит примерно так:
D3DVIEWPORT9 viewPort;
memset(&viewPort,0,sizeof(viewPort));
pDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&backBuffer);
viewPort.X = 0;
viewPort.Width = WINDOW_WIDTH;
viewPort.Height = WINDOW_HEIGHT;
if(SUCCEEDED(pDevice->BeginScene())) //Start the device .
{
pDevice->SetRenderTarget(0, backBuffer);
// Draw Right Eye Scene
viewPort.Y = lineOffset;
pDevice->SetViewport(&viewPort);
pDevice->StretchRect(rightImageBuffer,NULL,backBuffer,NULL,D3DTEXF_LINEAR);
// Draw Left Eye Scene
viewPort.Y = 0;
pDevice->SetViewport(&viewPort);
pDevice->StretchRect(leftImageBuffer,NULL,backBuffer,NULL,D3DTEXF_LINEAR);
backBuffer->Release();
pDevice->EndScene();
// Present both left and right buffers to the driver which will continuously
// alternate between them until the next present
pDevice->Present(NULL, NULL, NULL, NULL);
return S_OK;
}
return E_FAIL;
И в WINMAIN я вызываю рендеринг с этими операторами;
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(str.isReady) //If rendering fails,an error-message is shown.
{
str.SwitchToRightEye();
str.pDevice->Clear(0,NULL,D3DCLEAR_TARGET,0x000000ff, 1.0f, 0.0f);
str.UpdateRightQuadBuffer();
str.render();
}
TranslateMessage(&msg); //Translate and dispatch the messages for the getMessage loop.
DispatchMessage(&msg);
}