我正在尝试将位图图像显示到称为GL的OpenGL控件(我使用SharpGL作为包装器)。在实践中,将文本字符串写入GDI +图片框,从中获取位图。GLBitmap函数需要Byte()数组作为输入;我将位图转换为Byte()数组。我在屏幕上看到一堆点,似乎无法正常工作。我也将PictureBox图像保存到磁盘上的Bmp文件中,并交叉检查了它是否具有所需的内容。因此,Bmp映像在这里似乎不是问题。
实际OpenGL显示
根据以下代码创建的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
OpenGL需要原始像素数据... BMP具有编码...
为了完成这项工作,您需要从BMP中提取原始像素数据。由于那里有很多格式配置,因此可能无法正确完成工作...
因此请确保将位图更改为易于处理的格式,例如:
现在位图在其开始处有一个BMP标头,描述文件为BMP以及诸如分辨率,编码,组织等之类的信息。标头通常还包含像素的起始地址...因此提取该像素并传递RAW像素到您的GL纹理...
请注意,BMP像素是按ScanLine对齐的,因此图像的每一行都有一定的间隙BYTE来对齐某些大小的尺寸(通常为1..4字节),您需要跳过它然后处理另一行。这里有相关的质量检查(但可以通过VCL轻松解决,这不是您的情况)
但是您需要自己执行此操作,因此您需要:
[通过将行复制到您的内存阵列中来构造原始像素数据
跳过标题和对齐字节
将其作为OpenGL纹理传递
传递完整图像的速度比每行传递速度更快。请注意,您需要设置像素格式,使其与从bmp复制的原始数据匹配。因此bpp必须匹配,并且R,G,B顺序也要匹配。
渲染纹理四边形>>
btw。
FreeType
这样的库,但是您可以像这样使用纹理:[使用这种纹理的粗略CPU端GL文本渲染比GLSL容易得多。