gpt4 book ai didi

c++ - 使用 AMD Quad Buffer SDK - DirectX 9 查看 3D 图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:49 25 4
gpt4 key购买 nike

我目前正在做一个项目,我需要使用 Bumblebee2 3D 相机拍摄的图像来显示 3D 图像。我正在使用 MSI AE2420 计算机,它有支持 3D 的 AMD HD 5730。我也有快门眼镜以立体模式查看图像。

我正在使用 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 的四缓冲区 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);
}

最佳答案

我觉得你应该试试;

viewPort.Height = lineOffset;

代替

viewPort.Height = WINDOW_HEIGHT;

关于c++ - 使用 AMD Quad Buffer SDK - DirectX 9 查看 3D 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com