2011-02-08 5 views
4

私のNVIDIA/EVGAのGTX 580ステレオ画像を表示するためにステレオ対応グラフィックスカードをプログラムするにはどうすればよいですか?

にバンドル1から欠落している私が必要とする特定の機能があるので、私は、私はプログラムする方法を見つけ出すことはできません、私自身のステレオ画像ビューアを書きたいのですがカードを押して「シャッターグラス」モードに入り、1フレームおきに(120Hzで)左右に交互に表示されます。

私は、OpenGL、Direct3D、およびXNA APIとNVIDIAの情報を見てきましたが、開始方法を理解することはできません。別々の左右の画像を設定するにはどうすればいいですか、画面に表示する方法を教えてください。また、ドライバーにシャッターグラストランスミッターを作動させる方法を教えてください。

(シャッターグラスモードのステレオイメージとビデオを表示するためにバンドルされたソフトウェアを使用するときは、フルスクリーンで表示され、そのモードに入るときに画面が点滅します。 。3D対応のNVidia "ゲーマー"カード(570,580)で残りの画面を乱さずにウィンドウに3Dサーフェスを表示する方法はありますか?

答えて

2

GEForceの範囲のNVidia 3Dvision 次に、画像の左下に魔法の値を書き込む必要があります。運転手が眼鏡をピックアップしてオンにするnvapi.dllは不要です。

Nvidiaプロ眼鏡とQuadraカードでは、通常のOpenGLステレオAPIを使用できます。

ps.I通常のウィンドウでこれを行うためのいくつかのサンプルコードが見つかりました。
編集 - それは私が構築するために取得することができませんでしたxmitterに話し低レベルのUSBコードだったが、私はそれが最終的にここでは、このhttp://sourceforge.net/projects/libnvstusb/

になったNVISIONガラスとフルスクリーンのためのいくつかのサンプルコードだと思います。
私はDirectXのエキスパートではないので、これは最適ではないかもしれません。
マイアプリはまた、Qtベースされ、そこにはいくつかのQtのビットがコードに

----------------------------------------------------------------- 
    // header 
    void create3D(); 
    void set3D(); 
    IDirect3D9 *_d3d; 
    IDirect3DDevice9 *_d3ddev; 
    QSize _size; // full screen size 

    IDirect3DSurface9 *_imageBuf; //Source stereo image 
    IDirect3DSurface9 *_backBuf;  


-------------------------------------------------------- 
    // the code  
#include <windows.h> 
#include <windowsx.h> 
#include <d3d9.h> 
#include <d3dx9.h> 
#include <strsafe.h> 

#pragma comment (lib, "d3d9.lib") 

#define NVSTEREO_IMAGE_SIGNATURE 0x4433564e //NV3D 

typedef struct _Nv_Stereo_Image_Header 
{ 
unsigned int dwSignature; 
unsigned int dwWidth; 
unsigned int dwHeight; 
unsigned int dwBPP; 
unsigned int dwFlags; 
} NVSTEREOIMAGEHEADER, *LPNVSTEREOIMAGEHEADER; 


// ORedflags in the dwFlagsfielsof the _Nv_Stereo_Image_Headerstructure above 
#define SIH_SWAP_EYES 0x00000001 
#define SIH_SCALE_TO_FIT 0x00000002 

// call at start to set things up 
void DisplayWidget::create3D() 
{ 
     _size = QSize(1680,1050); //resolution of my Samsung 2233z 

     _d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface 

     D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information 

     ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use 
     d3dpp.Windowed = FALSE; // program fullscreen 
     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames 
     d3dpp.hDeviceWindow = winId(); // set the window to be used by Direct3D 
     d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // set the back buffer format to 32 bit // or D3DFMT_R8G8B8 
     d3dpp.BackBufferWidth = _size.width(); 
     d3dpp.BackBufferHeight = _size.height(); 
     d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; 
     d3dpp.BackBufferCount = 1; 

     // create a device class using this information and information from the d3dpp stuct 
     _d3d->CreateDevice(D3DADAPTER_DEFAULT, 
          D3DDEVTYPE_HAL, 
          winId(), 
          D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
          &d3dpp, 
          &_d3ddev); 


    //3D VISION uses a single surface 2x images wide and image high 
    // create the surface 
    _d3ddev->CreateOffscreenPlainSurface(_size.width()*2, _size.height(), D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &_imageBuf, NULL); 

    set3D(); 

} 

// call to put 3d signature in image 
void DisplayWidget::set3D() 
{ 

    // Lock the stereo image 
    D3DLOCKED_RECT lock; 
    _imageBuf->LockRect(&lock,NULL,0); 

    // write stereo signature in the last raw of the stereo image 
    LPNVSTEREOIMAGEHEADER pSIH = (LPNVSTEREOIMAGEHEADER)(((unsigned char *) lock.pBits) + (lock.Pitch * (_size.height()-1))); 

    // Update the signature header values 
    pSIH->dwSignature = NVSTEREO_IMAGE_SIGNATURE; 
    pSIH->dwBPP = 32; 
    //pSIH->dwFlags = SIH_SWAP_EYES; // Src image has left on left and right on right, thats why this flag is not needed. 
    pSIH->dwFlags = SIH_SCALE_TO_FIT; 
    pSIH->dwWidth = _size.width() *2; 
    pSIH->dwHeight = _size.height(); 

    // Unlock surface 
    _imageBuf->UnlockRect(); 

} 

// call in display loop 
void DisplayWidget::paintEvent() 
{ 
    // clear the window to a deep blue 
    //_d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); 

    _d3ddev->BeginScene(); // begins the 3D scene 

    // do 3D rendering on the back buffer here 
    RECT destRect; 
    destRect.left = 0; 
    destRect.top = 0; 
    destRect.bottom = _size.height(); 
    destRect.right = _size.width(); 

    // Get the Backbuffer then Stretch the Surface on it. 
    _d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &_backBuf); 
    _d3ddev->StretchRect(_imageBuf, NULL, _backBuf, &destRect, D3DTEXF_NONE); 
    _backBuf->Release(); 

    _d3ddev->EndScene(); // ends the 3D scene 

    _d3ddev->Present(NULL, NULL, NULL, NULL); // displays the created frame 
} 

// my images come from a camera 
// _left and _right are QImages but it should be obvious what the functions do 
void DisplayWidget::getImages() 
{ 
       RECT srcRect; 
       srcRect.left = 0; 
       srcRect.top = 0; 
       srcRect.bottom = _size.height(); 
       srcRect.right = _size.width(); 

       RECT destRect;    
       destRect.top = 0; 
       destRect.bottom = _size.height(); 

       if (isOdd()) {      
        destRect.left = _size.width(); 
        destRect.right = _size.width()*2; 
        // get camera data for _left here, code not shown    
        D3DXLoadSurfaceFromMemory(_imageBuf, NULL, &destRect,_right.bits(),D3DFMT_A8R8G8B8,_right.bytesPerLine(),NULL,&srcRect,D3DX_DEFAULT,0);   
       } else { 
        destRect.left = 0; 
        destRect.right = _size.width(); 
        // get camera data for _right here, code not shown   
        D3DXLoadSurfaceFromMemory(_imageBuf, NULL, &destRect,_left.bits(),D3DFMT_A8R8G8B8,_left.bytesPerLine(),NULL,&srcRect,D3DX_DEFAULT,0);   
       } 


       set3D(); // add NVidia signature 

} 

DisplayWidget::~DisplayWidget() 
{ 
    _d3ddev->Release(); // close and release the 3D device 
    _d3d->Release(); // close and release Direct3D 

} 
+0

ありがとう! NVidiaは本当にこれを明確にしません。 Proカード(Quadra)の場合、OpenGLの「うまくいく」かもしれないと思うが、コンシューマカードの場合、奇妙なことがある。私はNVAPIについていくつかのページを見て、カードをさまざまなモードにポーズするために呼び出すことができます。コンシューマーカードは、プロのカードとは違って、「フルスクリーン」モードでのみステレオを演奏するように見えるので、サンプルコードを見るのが好きです。 –

+0

AFAIKはフルスクリーンモードでのみ正常に動作します。 NVAPIのドキュメントは役に立ちません。ネット上の多くの人々がこれを釘付けにしています。Nvidiaは業界の人々にとってさえ全く役に立たない。 –

+0

ps。 http://www.mtbs3d.com/phpBB/のフォーラムをチェックしてください。3dvisionの専門家 –

3

を残したかもしれない、私は少し遅れてこれまでだけど、私はただGTXだけを使用していない動作するように立体3Dを得ました580およびOpenGL quadroカードやDirectXは不要です。

私はnVidia 3D VisionドライバとIRエミッタを持っており、nVidiaコントロールパネルでエミッタを "常にオン"に設定しています。

私のゲームエンジンでは、120Hzのフルスクリーンモードに切り替えて、わずかな錐体のオフセットでシーンを2回レンダリングします(マニュアル実装の "nvidia独自のドキュメンテーションPDF"のように "2010_GTC2010.pdf")。

クワッドバッファやその他のトリックは必要ありません。また、私は収束などのすべての設定を制御しています

関連する問題