2014-11-02 55 views
0

我需要將一些OpenGL代碼移植到C#OpenTK。 這裏是我從像素陣列中的C++更新映射PBO塊:OpenTK從位圖獲取像素字節數組

GLubyte* ptr = (GLubyte*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); 
    if(ptr) 
    { 

     memcpy(ptr,imageInfo.Data,IMG_DATA_SIZE); 
     glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); 

    } 

我需要做同樣在OpenTK.My圖像數據來自位圖的一個實例。 我試過如下:

 IntPtr ptr = GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly); 
     if(ptr != IntPtr.Zero) 
     { 
      BitmapData data = updateColorMap.LockBits(new System.Drawing.Rectangle(0, 0, updateColorMap.Width, updateColorMap.Height), 
       ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
       Marshal.Copy(data.Scan0, 0, ptr, IMG_DATA_SIZE); 
     } 

但Marshal.Copy要求第一個參數是字節[] type.I沒找到如何從BitmapData.It只返回IntPtr的檢索(data.Scan0 )。

那麼我怎樣才能從位圖獲取字節數組?

UPDATE:

在我得到的幫助來自OpenTK論壇的同時,他們提出要做到這一點,而不是:

  unsafe 
      { 
       GL.BufferData(BufferTarget.PixelUnpackBuffer, new IntPtr(IMG_DATA_SIZE), IntPtr.Zero, BufferUsageHint.StreamDraw); 
       byte* ptr = (byte*)GL.MapBuffer(BufferTarget.PixelUnpackBuffer, BufferAccess.WriteOnly); 


       if (ptr != null) 
       { 
        BitmapData data = updateDepthMap.LockBits(new System.Drawing.Rectangle(0, 0, updateDepthMap.Width, updateDepthMap.Height), 
        ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

        byte* scan0 = (byte*)data.Scan0.ToPointer(); 
        for (int i = 0; i < IMG_DATA_SIZE; ++i) 
        { 

         *ptr = *scan0; 
         ++ptr; 
         ++scan0; 
        } 

        updateDepthMap.UnlockBits(data); 
        GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer); 

       } 
      }//unsafe 

現在,這個工作,但它是非常慢!常規紋理更新運行速度比此更快,這是 錯誤,因爲異步PBO傳輸應加快紋理上傳速度。在我的C++版本中實現PBO上傳導致性能提升近2倍。

+0

它應該是正常的一個IntPtr或我失去了一些東西,但也有http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c-sharp – 2014-11-02 20:16:15

+0

它不是所有的權利,它會導致編譯錯誤。第一個參數期望字節[],而不是IntPtr – 2014-11-02 21:14:55

回答

-1

確定這樣的解決方案是在這裏:Copy data from from IntPtr to IntPtr

在Linux上進行測試。

+0

它崩潰。所以它不工作。 – 2014-11-03 10:35:01

+0

錯誤信息是什麼? – 2014-11-03 11:09:53

+0

緩衝區超出範圍。但我仔細檢查了所有緩衝區都具有相同的大小。 – 2014-11-03 11:36:38

相關問題