Visual C++ .NET 2008でOpenGLを使用してテクスチャキューブを作成しようとしています。 GLOBを使用してグーグルを行った後、gluBuild2DMipmapsを使用する必要があります。今管理対象ビットマップをアンマネージビットマップに正しく変換する方法は?
問題は、私はシステムを使用してビットマップを読み込む::描く、です:: Bitmap.FromFile()
、どのように私は、これはCONST void *型のパラメータを受け入れるgluBuild2DMipmapsにBitmapオブジェクトを管理渡します?
私はすでにこれらのコードを使用してする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のとラインのロックビットに貼り付け:追加の情報を:パラメータは有効ではありません。
何が間違っていましたか?
私はちょうど正しい解決策を見つけました。
- 私が間違ってオーバーロードされた関数を使用します。問題のカップルだからです。私が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
オハイオ州、私はそれを試みるべきです。厳密には、あなたが呼び出すLockBitsメソッドとは何ですか? – swdev
これは:http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx – Luca