首页 > 其他分享 >Opengl不使用Glut单元显示字符

Opengl不使用Glut单元显示字符

时间:2024-03-04 11:55:40浏览次数:21  
标签:SourceRow begin end Opengl Glut 显示字符 bitmap RawImage GL

在Opengl中显示字符多用Glut单元中的glutBitmapCharacter进行显示。这样有两个问题。

1、是不能显示汉字。

2、是要glut32.dll库支持。

通过研究可以不用Glut,只用其它的GL库就能实现中文显示

1、加入库

uses
OpenGLContext, GL,glu;

2、生成Opengl显示窗口

var
GLBox:TOpenGLControl;

procedure TForm1.FormCreate(Sender: TObject);
begin
GLBox:=TOpenGLControl.Create(Form1);
GLBox.AutoResizeViewport:=True;
GLBox.Parent:=Self;
GLBox.MultiSampling:=4;
GLBox.Align:=alClient;
GLBox.OnPaint:=@GLboxPaint;
GLBox.Invalidate;

end;

//------------------------------------------------------------------------------

{
用位图方式显示文字
ShowText: 要显示的文字
ShowX: 显示坐标
ShowY: 显示坐标
TextSize: 字体大小
Color: 字体色
TextName:字体 =''为默认字体
isGLZb:是否使用GL坐标 -1到1 0为中心 ,默认不使用 从左上角为0,0
isTM: 是否透明 默认透明
isShowDL:是否独立元素显示 为false时会和上一个元素一起运动 默认独立元素
TextTMD:字体透明度--以下isTM为真时有效
OutTMD:外边透明度
}
procedure glShowBitMapText(ShowText: string;ShowX: GLfloat;ShowY: GLfloat;
TextSize: integer = 12; TextColor: TColor=clWhite;TextName:String='';
isGLZb:Boolean=False; isTM: boolean = True;isShowDL:Boolean=True;TextTMD:Byte=255;OutTMD:Byte=0);
var
bitmap: Graphics.TBitmap;
bitH, bitW: integer;
PixelData: pbyte;
i: integer;
RowSize: integer;
SourceRow, DestRow: integer;
begin
//显示图片
bitmap := Graphics.TBitmap.Create;
bitmap.PixelFormat := pf32bit;
bitmap.Width := 0;
bitmap.Height := 0;
//字边是否填充白色
if isTM then
bitmap.Canvas.Brush.Style := bsClear;

bitmap.Canvas.Font.Name:=TextName;//'Microsoft YaHei UI''楷体';
bitmap.Canvas.Font.Size := TextSize;
//调整图片大小与字符串一致
bitW := bitmap.Canvas.TextWidth(ShowText);
bitH := bitmap.Canvas.TextHeight(ShowText);
bitmap.Width := bitW;
bitmap.Height := bitH;

Bitmap.Canvas.Font.Color := TextColor;
bitmap.Canvas.TextOut(0, 0, ShowText);


// 获取每行像素数据的字节数
RowSize := bitmap.Width * bitmap.RawImage.Description.BitsPerPixel div 8;
if isTM then
begin
//设置透明
SourceRow := bitmap.RawImage.Description.BitsPerPixel div 8;
for i := 0 to (bitmap.RawImage.DataSize div SourceRow) - 1 do
begin
if (bitmap.RawImage.Data + i * SourceRow)^ +
(bitmap.RawImage.Data + i * SourceRow + 1)^ +
(bitmap.RawImage.Data + i * SourceRow + 2)^ > 0 then
(bitmap.RawImage.Data +i * SourceRow + 3)^ := TextTMD
else
(bitmap.RawImage.Data +i * SourceRow + 3)^ :=OutTMD;
end;
end;

// 垂直翻转图像数据
GetMem(PixelData, RowSize * bitmap.Height);
SourceRow := 0;
DestRow := bitmap.Height - 1;
for i := 0 to bitmap.Height - 1 do
begin
Move(bitmap.RawImage.Data[(SourceRow * RowSize)],
PixelData[(DestRow * RowSize)], RowSize);
Inc(SourceRow);
Dec(DestRow);
end;

if isShowDL then
glLoadIdentity;

If NOT isGLZb Then //GL坐标换算
begin
ShowY:=1-((ShowY+bitmap.Height)/(glGetViewportHeight/2));
ShowX:=(1-((ShowX)/(glGetViewportWidth/2)))*-1;
end;

glRasterPos2f(ShowX, ShowY); //使用画布 设置开始位置

if isTM then
begin
glEnable(GL_BLEND);//启动透明层
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawPixels(bitmap.Width, bitmap.Height, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
PixelData);
glDisable(GL_BLEND);
end
else
begin
glDisable(GL_BLEND);//关透明层
glDrawPixels(bitmap.Width, bitmap.Height, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
PixelData);
end;

Freemem(PixelData);
bitmap.Free;
end;

//--------------------------------------------------------------------------

procedure TForm1.GLboxPaint(Sender: TObject);

begin

glClearColor(0.27, 0.53, 0.71, 1.0); 
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glShowBitMapText('中文显示ABC',10,10,16,clRed,'楷体',false,true,true,255,0);

GLbox.SwapBuffers;
end;

标签:SourceRow,begin,end,Opengl,Glut,显示字符,bitmap,RawImage,GL
From: https://www.cnblogs.com/jwjss/p/18051519

相关文章

  • QVTKOpenGLNativeWidget中绘制vtkButtonWidget
    本文探讨了如何结合Qt和VTK(VisualizationToolkit)开发图形用户界面(GUI),通过一个具体的案例,详细介绍了如何在Qt应用程序中嵌入VTK渲染器,并创建交互式的图形元素,如按钮,以实现更丰富的用户体验。文章还深入剖析了如何处理按钮点击事件,以及如何将Qt的图像数据转换为VTK格式。介绍:在......
  • Avalonia 跨平台框架中如何以正确的姿势使用 OpenGL ES 渲染。
    前言这是一篇很水的文章,没有任何技术含量,在Github已经有很多人对Avalonia的OpenGLES支持进行了讨论,但是我还是想写一篇文章来记录一下我是如何在Avalonia中使用OpenGLES的。介绍在介绍Avalonia和OpenGLES之前,我们先来了解一下什么是Avalonia和OpenGLES以......
  • OpenGL中的Frame Buffer、Depth Buffer、Color Buffer、Stencil Buffer
    FrameBufferFrameBuffer:是一块buffer(即内存),存储了一帧的buffer数据。从数据结构的角度来看,此处的FrameBuffer并不是一个真正意义上的buffer,其存了一些指针,分别指向DepthBuffer、ColorBuffer、StencilBuffer、Texture、RBO(RenderBufferObject)等。Wiki中的解释:https......
  • 04 OpenGL渲染管线
    OpenGL做了什么?坐标系+物体+摄像机(观察者),经过渲染最后得到二位屏幕的图像。渲染过程第一步:首先要初始化一个三角形(定点位置、每个定点的属性),还需要初始化摄像机(观察者)。第二步:移动三角形,移动摄像机(观察者)。第三步:以观察者为中心,观察世界。第四步:投影-->把能看到的......
  • vs+qt中使用opengl及关键报错“无法打开包括文件: no such file or directory”与“err
    参考链接https://blog.csdn.net/qq_22533607/article/details/79792083http://t.csdnimg.cn/T8II5http://t.csdnimg.cn/JP8k7基础准备:vs中配置qt插件(略)关键步骤:创建QtWidgetApplication项目将BaseClass修改成QWidget,方框中的内容可以不勾,个人习惯ui文件中添加open......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • OpenGL学习(一)
    OpenGL学习(一)基本概念因为OpenGLES是OpenGL的一个子集,所以下面就主要介绍一些有关OpenGL的一些基本概念。OpenGL的结构可以从逻辑上划分为下面3个部分:图元(Primitives)缓冲区(Buffers)光栅化(Rasterize)图元(Primitives)在OpenGL的世界里,我们只能画点、线、三角形这......
  • OpenGL学习(二)——GLFW
    OpenGL学习(二)——GLFW参考资料:【双语】【TheCherno】OpenGL_哔哩哔哩_bilibili[LearnOpenGLCN(learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01Gettingstarted/02Creatingawindow/)LearnOpenGL示例环境搭建-知乎(zhihu.com)创建窗口[你好,窗......
  • OpenGL学习(三)——GLSL
    OpenGL学习(三)——GLSL参考资料:【双语】【TheCherno】OpenGL_哔哩哔哩_bilibili[LearnOpenGLCN(learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01Gettingstarted/02Creatingawindow/)LearnOpenGL示例环境搭建-知乎(zhihu.com)GLSL着色器(Shad......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......