0
我想在Visual C++ .NET 2008中使用OpenGL创建一个带纹理的立方体。 在使用GLU进行一些Googgling之后,我发现我必须使用gluBuild2DMipmaps。如何正确地将托管位图转换为非托管位图?
的问题是,我读使用System ::绘图:: Bitmap.FromFile()
位图现在,我如何通过这个管理Bitmap对象gluBuild2DMipmaps,其接受常量无效*参数???
我已经在使用这些代码尝试LockBits:
BYTE * data;
/*ambil raw data*/
System::Drawing::Rectangle rect = System::Drawing::Rectangle(0,0,b->Width,b->Height);
System::Drawing::Imaging::BitmapData^bitmapData;
b->LockBits(
rect,
System::Drawing::Imaging::ImageLockMode::ReadWrite,
b->PixelFormat ,bitmapData);
::memcpy(data,bitmapData->Scan0.ToPointer(),b->Width * b->Height);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,
GL_RGB, GL_UNSIGNED_BYTE, data);
使用和24bpp BMP文件,它停留在与消息System.ArgumentException行lockbit:附加信息:参数无效。
我做错了什么?
我刚找到正确的解决方案。这是因为几个问题:
- 我使用了错误的重载函数。看到我如何调用lockBits
- 我不是初始化指针
dataBitmap
。 - 此外,由于
GLuint * texture;
是一个托管指针,我必须使用pin_pointer
将其转换为非托管指针。
谢谢,这是正确的方法:
void CBox::LoadTextureRaw(String^filename, int wrap)
{
//GLuint texture;
System::Drawing::Bitmap^bitmap = gcnew Bitmap(filename);
int h = bitmap->Height;
int w = bitmap->Width;
int s = w * h;
dataTexture = new BYTE[s * 3];
System::Drawing::Rectangle rect = System::Drawing::Rectangle(0,0,bitmap->Width,bitmap->Height);
System::Drawing::Imaging::BitmapData^bitmapData =
bitmap->LockBits(rect,System::Drawing::Imaging::ImageLockMode::ReadWrite , System::Drawing::Imaging::PixelFormat::Format24bppRgb);
::memcpy(dataTexture,bitmapData->Scan0.ToPointer(),s);
bitmap->UnlockBits(bitmapData);
pin_ptr<GLuint*> pt = &texture;//pin managed pointer, to be unmanaged... asyeeeem
**pt = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, w, h,GL_RGB, GL_UNSIGNED_BYTE, dataTexture);
}
代码看起来是一样的,期望我调用一个不同的LockBits重载方法。 – Luca 2011-02-06 10:06:34