我需要將一些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倍。
它應該是正常的一個IntPtr或我失去了一些東西,但也有http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c-sharp – 2014-11-02 20:16:15
它不是所有的權利,它會導致編譯錯誤。第一個參數期望字節[],而不是IntPtr – 2014-11-02 21:14:55