Я пытаюсь создать текстурированный куб, используя OpenGL в Visual C++. NET 2008. После некоторого искажения, используя GLU, я обнаружил, что должен использовать gluBuild2DMipmaps.Как правильно преобразовать управляемое растровое изображение в неуправляемое растровое изображение?
проблема, я прочитал растрового изображения с помощью системы :: Drawing :: 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 файл, он застрял на линии 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);
}
Код кажется таким же, ожидается, что я вызову другой перегруженный метод LockBits. – Luca
owh, я должен попробовать это. Что, точнее, ваш метод LockBits, который вы называете? – swdev
Это: http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx – Luca