在OpenGL中显示位图

问题描述 投票:1回答:1

我正在尝试将位图图像显示到称为GL的OpenGL控件(我使用SharpGL作为包装器)。在实践中,将文本字符串写入GDI +图片框,从中获取位图。GLBitmap函数需要Byte()数组作为输入;我将位图转换为Byte()数组。我在屏幕上看到一堆点,似乎无法正常工作。我也将PictureBox图像保存到磁盘上的Bmp文件中,并交叉检查了它是否具有所需的内容。因此,Bmp映像在这里似乎不是问题。

实际OpenGL显示“实际OpenGL显示”

根据以下代码创建的Bmp文件“从下面的代码创建的Bmp文件”

想知道我在做什么错。有人会提出建议吗?预先感谢。

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
vb.net opengl bitmap
1个回答
0
投票

OpenGL需要原始像素数据... BMP具有编码...

为了完成这项工作,您需要从BMP中提取原始像素数据。由于那里有很多格式配置,因此可能无法正确完成工作...

因此请确保将位图更改为易于处理的格式,例如:

  1. 未压缩
  2. 24或32 bpp

现在位图在其开始处有一个BMP标头,描述文件为BMP以及诸如分辨率,编码,组织等之类的信息。标头通常还包含像素的起始地址...因此提取该像素并传递RAW像素到您的GL纹理...

请注意,BMP像素是按ScanLine对齐的,因此图像的每一行都有一定的间隙BYTE来对齐某些大小的尺寸(通常为1..4字节),您需要跳过它然后处理另一行。这里有相关的质量检查(但可以通过VCL轻松解决,这不是您的情况)

但是您需要自己执行此操作,因此您需要:

  1. 潜入BMP fileformat
  2. 从标题获取分辨率和像素数据的起始地址
  3. [通过将行复制到您的内存阵列中来构造原始像素数据

    跳过标题和对齐字节

  4. 将其作为OpenGL纹理传递

    传递完整图像的速度比每行传递速度更快。请注意,您需要设置像素格式,使其与从bmp复制的原始数据匹配。因此bpp必须匹配,并且R,G,B顺序也要匹配。

  5. 渲染纹理四边形>>

  6. btw。

容易得多,可以直接在OpenGl中打印文本。有像FreeType这样的库,但是您可以像这样使用纹理:
  • GLSL debug prints
  • [使用这种纹理的粗略CPU端GL文本渲染比GLSL容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.