Я пытаюсь создать текстурированный куб, используя OpenGL в Visual C ++. NET 2008.
После некоторого поиска, используя GLU, я обнаружил, что должен использовать gluBuild2DMipmaps.
Проблема в том, что я читаю растровое изображение, используя System :: Drawing :: Bitmap.FromFile ()
Теперь, как мне передать этот управляемый объект Bitmap в gluBuild2DMipmaps, которые принимают параметр const void * ???
Я уже пробовал 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);
Используя BMP-файл 24bpp, он застрял на строке lockbit с сообщением System.ArgumentException: Дополнительная информация: параметр недействителен.
Что я сделал не так ????
Я только что нашел правильное решение. Это потому что пара проблем:
- Я использую неправильную перегруженную функцию. Посмотрите, как я называю 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);
}