スポンサーリンク

FTGLを試す(2)文字列の描画

FTGLを使うと日本語を出力できる。

サンプルコード

#include <iostream>

#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <gl/freeglut.h>

#include <FTGL/ftgl.h>

#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"freeglut.lib")
#pragma comment(lib,"ftgl.lib")

#pragma warning(disable:4996)

// freeglut:
// http://freeglut.sourceforge.net/

// freetype2:
// https://www.freetype.org/

//FTGL
// https://sourceforge.net/projects/ftgl/

// 参考サイト FTGLの使い方
// http://slis.tsukuba.ac.jp/~fujisawa.makoto.fu/lecture/iml/text/screen_character.html

//ウィンドウの幅と高さ
int width, height;


struct CFtglObject {
  const char* FONT_PATHNAME = "C:\\Windows\\Fonts\\msgothic.ttc";
  FTPixmapFont* g_pFont;
  unsigned long g_ulFontSize;  // フォントサイズ

  ~CFtglObject() {
    delete g_pFont;
  }
 
  // フォントの初期化
  void init(const unsigned long fontsize) {

    g_ulFontSize = fontsize;

    if (!g_pFont) {
      g_pFont = new FTPixmapFont(FONT_PATHNAME);
      if (g_pFont->Error()) {
        delete g_pFont;
        g_pFont = nullptr;
      }
      else {
        g_pFont->FaceSize(g_ulFontSize);
      }
    }
  }
  // FTGLで文字列を描画
  void print(const std::wstring& wstr,float x, float y) {

    if (g_pFont) {
      glRasterPos2f(x, y);
      g_pFont->Render(wstr.c_str());
    }

  }
};
CFtglObject ftglo;

static int rot = 0;

//描画関数
void disp(void) {

  glViewport(0, 0, width, height);

  glClearColor(0.2, 0.2, 0.2, 1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glLoadIdentity();
  glScaled(0.5, 0.5, 0.5);

  glRotatef(rot, 1, 1, 1);
  rot++;

  glDisable(GL_CULL_FACE);
  double v = 0.7;

  glBegin(GL_QUADS);
  glColor3d(1, 0, 0);
  glVertex2d(-v, -v);

  glColor3d(0, 1, 0);
  glVertex2d(v, -v);

  glColor3d(0, 0, 1);
  glVertex2d(v, v);

  glColor3d(1, 1, 1);
  glVertex2d(-v, v);

  glEnd();

  glColor3d(1, 1, 0);
  wchar_t text[1000];
  swprintf(text, L"赤 %0.3lf %0.3lf",-v, -v);
  ftglo.print(text, -v, -v );

  swprintf(text, L"緑 %0.3lf %0.3lf", v, -v);
  ftglo.print(text,  v, -v);

  swprintf(text, L"青 %0.3lf %0.3lf", v, v);
  ftglo.print(text,  v,  v);

  swprintf(text, L"白 %0.3lf %0.3lf",-v, v);
  ftglo.print(text, -v,  v);
  glFlush();
}

//ウィンドウサイズの変化時に呼び出される
void reshape(int w, int h) {
  width = w; height = h;

  disp();
}

//ドラッグ
void motion(int x, int y)
{
  disp();
}

//エントリポイント
int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 50);
  glutInitWindowSize(500, 500);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

//FTGL使用クラスの初期設定 ftglo.init(25); glutCreateWindow("sample"); glutDisplayFunc(disp); glutReshapeFunc(reshape); glutMotionFunc(motion); glutMainLoop(); return 0; }

2 件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: