Показать растровое изображение в OpenGL - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь отобразить растровое изображение в элементе управления OpenGL под названием GL (в качестве оболочки используется SharpGL). На практике текстовая строка записывается в поле GDI + Picture, из которого получается растровое изображение. Для функции GLBitmap требуется входной массив Byte (); Я преобразую растровое изображение в массив Byte (). Кажется, не работает, поскольку я получаю кучу точек на экране. Я также сохранил изображение PictureBox в файл Bmp на диске и проверил, что оно имеет желаемый контент. Таким образом, изображение Bmp здесь не является проблемой.

Фактический дисплей OpenGL Actual OpenGL display

Файл Bmp создан из кода ниже Bmp file created from the code below

Интересно, что Я делаю не так У кого-нибудь было бы предложение? Заранее спасибо.

Код VB. Net приведен ниже.

' Create Bitmap & Graphics context for string
'
' iWidth and iHeight are the dimensions of the bitmap;
' they are a power of 2.
Dim SharpBMap As Bitmap = New Bitmap(iWidth, iHeight) 
Dim SharpGraf As Graphics = Graphics.FromImage(SharpBMap)

' Draw text string to SharpGraf PictureBox
'
SharpGraf.SmoothingMode = Drawing2D.SmoothingMode.HighQuality              
SharpGraf.Clear(Color.White) 
SharpGraf.DrawString(TxtStr, CurrFont, CurrBrush, 0, 0, CurrFormat)

' OutSharpGL is the Picture box to which the text string is sent
OutSharpGL.Image = SharpBMap

' Save the bitmap to disk: when the file is viewed, the image is Ok.
SharpBMap.Save(FilNameStr)

' Set the color
Gl.Color(1.0f, 1.0f, 1.0f)

' Set the Raster position
Gl.RasterPos(0, 0) 

' Transfer the Bitmap
Gl.Bitmap(iWidth, iHeight, 0.0f, 0.0f, 0.0f, 0.0f, BitmapToByte(SharpBMap))


' Function to convert a Bitmap to a Byte() array
Friend Function BitmapToByte(ByRef Bmp As Bitmap) As Byte()

    Dim converter As New ImageConverter()

    Return DirectCast(converter.ConvertTo(Bmp, GetType(Byte())), Byte())
End Function

1 Ответ

1 голос
/ 14 февраля 2020

OpenGL требует необработанных данных о пикселях ... BMP имеет кодировку ...

Чтобы выполнить эту работу, вам необходимо извлечь необработанные данные о пикселях из BMP. Это может быть слишком сложно для правильной работы, поскольку существует множество конфигураций форматов ...

Поэтому убедитесь, что вы изменили свое растровое изображение на формат, который легко обрабатывается, например:

  1. несжатый
  2. 24 или 32 bpp

Теперь растровое изображение имеет заголовок BMP в начале, описывающий файл как BMP и такие как разрешение, кодирование, организация и т. Д. c. .. Заголовок также обычно содержит начальный адрес пикселей ... Так что извлеките его и передайте пиксели RAW в вашу текстуру GL ...

Остерегайтесь выравнивать пиксели BMP на основе ScanLine, чтобы каждая строка изображения имеет некоторый пробел BYTE для выравнивания по определенному кратному размеру (обычно 1..4 байта), вам нужно пропустить его и затем обработать другую строку. Здесь связанные QA (но легко решается с помощью VCL, что не в вашем случае)

Однако вы нужно сделать это самостоятельно, поэтому вам нужно:

  1. погрузиться в формат файла BMP
  2. получить разрешение и начальный адрес данных пикселей из заголовка
  3. создайте ваши необработанные данные пикселей, скопировав строки в массив вашей памяти

    , пропуская заголовок и байты выравнивания

  4. передайте это как текстуру OpenGL

    быстрее передавать изображение целиком, чем в расчете на строку. Осторожно, вам нужно установить формат пикселей, чтобы он соответствовал вашим необработанным данным, скопированным из BMP. Таким образом, bpp должен совпадать, а также порядок R, G, B.

  5. рендеринг текстурированного квада

btw. много Проще было бы печатать тексты прямо в OpenGl. Для этого есть библиотеки вроде FreeType, но вы можете использовать вместо них такие текстуры:

с грубой стороны процессора GL рендеринг текста с использованием такой текстуры намного проще, чем в GLSL. Вы просто обрабатываете текстуру как Атлас текстуры, где координаты текстуры вычисляются из кода ASCII и организации шрифтов текстуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...