zoukankan      html  css  js  c++  java
  • OpenGL学习笔记(13)位图与文字

    位图由一个个像素组成,画位图,就是画一个个像素点.如下图

    image

    像素点越多,那么图片的清晰度就更高。当然由于让一个人用一个个像素画图片,那真是痛苦...so,只是了解下函数而已.

    OpenGL中画位图的三个步骤

    一.定位(glRasterPos)

    假设你画下一个像素点,那么首先则需要确定位置

    二.定义位图的像素点

    一个图形由一组像素组成,如下图的F

    image

    其像素点由一个数组组成,每行都是一个矩形,如0xc0转成二进制则是11,所以0xc0跟0x00就是从0开始到右侧第2个位置,每行类似.由此这个F的高度为12,宽度为10.

    如ff的转换

    image

    定义的像素点如下

    GLubyte rasters[24] = {
       0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
       0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
       0xff, 0xc0, 0xff, 0xc0};

    绘制像素点

    我们知道正常图片不管放大还是缩小都会变的模糊,为了保持最清晰状态,那么展示的图片跟大小就要跟源高度宽度相符合,所以上面的F高度宽度为12,10

    使用glBitmap绘制绘图

    glBitmap (10, 12, 0.0, 0.0, 11.0, 0.0, rasters);

    第1,2个参数表示宽度与高度

    当指定glRasterPos参数时,其坐标点则作为原始的(0,0)坐标点

    第3,4个参数表示与相对坐标的位置

    绘制多个位图

    当一个位图位置完毕后,如果位图没有完成,则继续绘制像素点,当一个位图绘制完成后,可以进行移位,移位后的坐标则成为了起始点,
    如上glBitmap的第5,6个参数,表示位移几个像素,由于宽度是10,所以要大于10才不会导致位图重叠,我们将x坐标的间隔改为25,绘制三个F看一下效果,如下

    image

    下图解释了glBitmap参数的用法

    image

    示例代码

    GLubyte rasters[24] = {
       0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
       0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
       0xff, 0xc0, 0xff, 0xc0};
    
    void init(void)
    {
       glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
       glClearColor (0.0, 0.0, 0.0, 0.0);
    }
    
    void display(void)
    {
       glClear(GL_COLOR_BUFFER_BIT);
       glColor3f (1.0, 1.0, 1.0);
       glRasterPos2i (20, 20);
       glBitmap (10, 12, 0.0, 0.0, 25.0, 0.0, rasters);
       glBitmap (10, 12, 0.0, 0.0, 25.0, 0.0, rasters);
       glBitmap (10, 12, 0.0, 0.0, 25.0, 0.0, rasters);
       glFlush();
      
    }

    记得先初始化时调用glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

    绘制完整的英文字母

    首先需要把26个英文字母的像素点给绘制下来,然后保存到各自的显示列表中,并记录显示列表的索引值,然后根据输入的文字,调用相关的显示列表索引值

    先看效果

    image

    代码示例,像素点真的很晕…

    GLubyte space[] = 
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    
    GLubyte letters[][13] = {
    {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18}, 
    {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, 
    {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, 
    {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, 
    {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, 
    {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, 
    {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, 
    {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, 
    {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, 
    {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, 
    {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, 
    {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, 
    {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, 
    {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, 
    {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, 
    {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, 
    {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, 
    {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, 
    {0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, 
    {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, 
    {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, 
    {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, 
    {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, 
    {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, 
    {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, 
    {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}
    };
    
    GLuint fontOffset;
    
    void makeRasterFont(void)
    {
       GLuint i, j;
       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    
       fontOffset = glGenLists (128);
       for (i = 0,j = 'A'; i < 26; i++,j++) {
          glNewList(fontOffset + j, GL_COMPILE);
          glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]);
          glEndList();
       }
       glNewList(fontOffset + ' ', GL_COMPILE);
       glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space);
       glEndList();
    }
    
    void init(void)
    {
       glShadeModel (GL_FLAT);
       makeRasterFont();
    }
    
    void printString(char *s)
    {
       glPushAttrib (GL_LIST_BIT);
       glListBase(fontOffset);
       glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s);
       glPopAttrib ();
    }
    
    /* Everything above this line could be in a library 
     * that defines a font.  To make it work, you've got 
     * to call makeRasterFont() before you start making 
     * calls to printString().
     */
    void display(void)
    {
       GLfloat white[3] = { 1.0, 1.0, 1.0 };
    
       glClear(GL_COLOR_BUFFER_BIT);
       glColor3fv(white);
    
       glRasterPos2i(20, 60);
       printString("THE QUICK BROWN FOX JUMPS");
       glRasterPos2i(20, 40);
       printString("OVER A LAZY DOG");
       glFlush ();
    }
  • 相关阅读:
    vue实例讲解之axios的使用
    实例讲解webpack的基本使用第四篇
    实例讲解webpack的基本使用第三篇
    实例讲解webpack的基本使用第二篇
    写好一篇技术博客的正确姿势是什么
    实例讲解js正则表达式的使用
    一个综合实例讲解vue的基础知识点。
    vue实例讲解之vue-router的使用
    .NET 串口通信
    textarea赋值时换行符无效的解决方法
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1863554.html
Copyright © 2011-2022 走看看