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