2011-05-09 12 views
6

मैं एक बहुत ही सरल एप्लिकेशन बनाने की कोशिश कर रहा हूं जो प्रत्येक आंख पर अलग-अलग छवियों को प्रदर्शित करेगा। मेरे पास असस वीजी 236 एच मॉनिटर और एनवीआईडीआईए 3 डी विजन किट, स्टीरियो 3 डी शटर ग्लास है। मैं सी #, .NET Framework 2.0, डायरेक्टएक्स 9 (प्रबंधित डायरेक्ट एक्स) और विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं। मैं उदाहरण और ट्यूटोरियल के लिए उच्च और निम्न खोज कर रहा हूं, वास्तव में एक जोड़े को मिला है और उन पर आधारित है जिन्हें मैंने प्रोग्राम बनाया है लेकिन किसी कारण से मैं इसे काम नहीं कर सकता।सी # के साथ अलग स्टीरियो-फ्रेम को कैसे नियंत्रित करें? (एनवीआईडीआईए 3 डी शटर ग्लास)

जब उदाहरण के लिए देख कैसे हर आंख के लिए अलग छवियों को प्रदर्शित करने, कई लोगों जीडीसी 09 (प्रसिद्ध GDC09-3DVision-The_In_and_Out.pdf दस्तावेज़) और पृष्ठों को 37-40 पर NVIDIA प्रस्तुति की चर्चा करते हुए रहते हैं। मेरे कोड मुख्य रूप से है कि उदाहरण के आधार पर निर्माण किया है:

  1. मैं सतह पर दो बनावट (Red.png और Blue.png) (_imageLeft और _imageRight), समारोह LoadSurfaces()
  2. Set3D में लोड हो रहा है कर रहा हूँ() फ़ंक्शन उन दो छवियों को साइड-बाय-साइड को एक बड़ी छवि में रखता है जिसमें 2x स्क्रीन चौड़ाई और स्क्रीन ऊंचाई + 1 (_imageBuf) का आकार होता है।
  3. Set3D() फ़ंक्शन अंतिम पंक्ति पर स्टीरियो हस्ताक्षर जोड़कर जारी रहता है।
  4. ऑनपेंट() - फ़ंक्शन बैक बफर (_backBuf) लेता है और संयुक्त छवि (_imageBuf) की सामग्री को प्रतिलिपि बनाता है।

जब मैं कार्यक्रम चलाने, शटर चश्मा काम शुरू है, लेकिन मैं केवल दो छवियों स्क्रीन पर पक्ष-साथ देखते हैं। क्या कोई मेरी मदद कर सकता है और बता सकता है कि मैं क्या गलत कर रहा हूं? मेरा मानना ​​है कि इस समस्या को हल करने से दूसरों की भी मदद मिल सकती है क्योंकि अभी तक एक सरल उदाहरण नहीं है कि सी # के साथ ऐसा कैसे करें।

नीचे मेरे कोड के सामरिक भाग हैं। पूरा परियोजना यहाँ डाउनलोड किया जा सकता है: http://koti.mbnet.fi/jjantti2/NVStereoTest.rar

public void InitializeDevice() 
    { 
     PresentParameters presentParams = new PresentParameters(); 

     presentParams.Windowed = false; 
     presentParams.BackBufferFormat = Format.A8R8G8B8; 
     presentParams.BackBufferWidth = _size.Width; 
     presentParams.BackBufferHeight = _size.Height; 
     presentParams.BackBufferCount = 1; 
     presentParams.SwapEffect = SwapEffect.Discard; 
     presentParams.PresentationInterval = PresentInterval.One; 
     _device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams); 
    } 

    public void LoadSurfaces() 
    { 
     _imageBuf = _device.CreateOffscreenPlainSurface(_size.Width * 2, _size.Height + 1, Format.A8R8G8B8, Pool.Default); 

     _imageLeft = Surface.FromBitmap(_device, (Bitmap)Bitmap.FromFile("Blue.png"), Pool.Default); 
     _imageRight = Surface.FromBitmap(_device, (Bitmap)Bitmap.FromFile("Red.png"), Pool.Default); 
    } 

    private void Set3D() 
    { 
     Rectangle destRect = new Rectangle(0, 0, _size.Width, _size.Height); 
     _device.StretchRectangle(_imageLeft, _size, _imageBuf, destRect, TextureFilter.None); 
     destRect.X = _size.Width; 
     _device.StretchRectangle(_imageRight, _size, _imageBuf, destRect, TextureFilter.None); 

     GraphicsStream gStream = _imageBuf.LockRectangle(LockFlags.None); 

     byte[] data = new byte[] {0x44, 0x33, 0x56, 0x4e, //NVSTEREO_IMAGE_SIGNATURE   = 0x4433564e 
            0x00, 0x00, 0x0F, 0x00, //Screen width * 2 = 1920*2 = 3840 = 0x00000F00; 
            0x00, 0x00, 0x04, 0x38, //Screen height = 1080    = 0x00000438; 
            0x00, 0x00, 0x00, 0x20, //dwBPP = 32      = 0x00000020; 
            0x00, 0x00, 0x00, 0x02}; //dwFlags = SIH_SCALE_TO_FIT  = 0x00000002; 

     gStream.Seek(_size.Width * 2 * _size.Height * 4, System.IO.SeekOrigin.Begin); //last row 
     gStream.Write(data, 0, data.Length); 

     gStream.Close(); 

     _imageBuf.UnlockRectangle(); 
    } 

    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) 
    { 
     _device.BeginScene(); 

     // Get the Backbuffer then Stretch the Surface on it. 
     _backBuf = _device.GetBackBuffer(0, 0, BackBufferType.Mono); 
     _device.StretchRectangle(_imageBuf, new Rectangle(0, 0, _size.Width * 2, _size.Height + 1), _backBuf, new Rectangle(0, 0, _size.Width, _size.Height), TextureFilter.None); 
     _backBuf.ReleaseGraphics(); 

     _device.EndScene(); 

     _device.Present(); 

     this.Invalidate(); 
    } 

उत्तर

2

मेरा एक दोस्त समस्या पाया। स्टीरियो हस्ताक्षर में बाइट उलटा क्रम में थे। यहां सही क्रम है:

byte[] data = new byte[] {0x4e, 0x56, 0x33, 0x44, //NVSTEREO_IMAGE_SIGNATURE   = 0x4433564e; 
0x00, 0x0F, 0x00, 0x00, //Screen width * 2 = 1920*2 = 3840 = 0x00000F00; 
0x38, 0x04, 0x00, 0x00, //Screen height = 1080    = 0x00000438; 
0x20, 0x00, 0x00, 0x00, //dwBPP = 32      = 0x00000020; 
0x02, 0x00, 0x00, 0x00}; //dwFlags = SIH_SCALE_TO_FIT  = 0x00000002; 

कोड इस परिवर्तन के बाद पूरी तरह से काम करता है। यह कोड किसी अन्य चीज़ के लिए किसी अन्य व्यक्ति के लिए एक अच्छा ट्यूटोरियल के रूप में भी काम कर सकता है। :)

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^