如何在Ogre3d中正确地向Hardwarepixelbuffer提供数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Ogre3d中正确地向Hardwarepixelbuffer提供数据?相关的知识,希望对你有一定的参考价值。

“OGRE 3D 1.7应用程序开发手册”中有一段代码如下:

m_VideoTexture->m_PixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
memcpy(m_VideoTexture->m_PixelBuffer->getCurrentLock().data, lpbi + lpbi->biSize + 25, lpbi->biSizeImage);
m_VideoTexture->m_PixelBuffer->unlock();

为什么lpbi加上lpbi的biSize还加上25?因为我想将代码转换为C#,我几乎完成了,渲染的纹理是绿色而不是视频的原始颜色。像这样:

这是我的c#代码:

System.Drawing.Bitmap bitmap = videotexMgr.Stream.GetBitmap(videotex.FrameNum);
        MemoryStream ms = new MemoryStream();
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        byte[] bitmapBuffer = new byte[ms.Length];
        ms.Seek(0, SeekOrigin.Begin);
        ms.Read(bitmapBuffer, 0, bitmapBuffer.Length);
        ms.Close();

        videotexMgr.PixelBuffer.Lock(HardwareBuffer.LockOptions.HBL_DISCARD);
        Marshal.Copy(bitmapBuffer, 0, videotex.PixelBuffer.CurrentLock.data, bitmapBuffer.Length);
        videotexMgr.PixelBuffer.Unlock();

PS:原始视频是黑白的,我得到的位图是正确的

答案

OP解决方案。

正确的代码:

System.Drawing.Bitmap bitmap = videotex.Stream.GetBitmap(videotex.FrameNum);
bitmap.Save("./Media/materials/textures/xx.png");
Image image = new Image();
image.Load("xx.png", "General");
image.FlipAroundX();
videotexMgr.PixelBuffer.BlitFromMemory(image.GetPixelBox());
image.Dispose();

videotexMgr.FrameNum++;

以上是关于如何在Ogre3d中正确地向Hardwarepixelbuffer提供数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 luminati.io 等代理服务器正确地向 https 发出请求?

在 Win8 中使用 GCC、C::B 安装 Ogre3D

《天龙八部》及Ogre3D模型的3ds max导入插件(源码公布)

Ogre3D : 构建示例程序 (Samples/Tutorial/Bootstrap.cpp)

Ogre3d restoreConfig 导致应用程序在 Ubuntu 上挂起

退出程序时抛出异常(Ogre3d)