質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2348閲覧

OpenGLを使った自作printf関数作成

hikar

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/02 16:07

編集2020/02/03 13:25

前提・実現したいこと

Yutuber ゲーム道館さんの「OpenGL道場 第7回「文字列」」を拝見させていただいて、自作printfの引数がよくわからなかったので質問させていただきました。
動画はとても参考になりました。<(_ _)>
ここに質問の内容を詳しく書いてください。
No.1
自作文字列描画関数:ソースコードの定義
void fontDraw(const char *_format, ...){....//処理}
まず上の関数なのですが、引数の...がどのような意味を持っているのかわかりません。
...は引数をいくつでも取得することができるということでしょうか?

NO.2
そしてこちらはmainでの描画呼び出しです。
fontDraw("angle:%f", angle);
上の引数で、angleは"%f"に代入されるのでしょうか?そうだとしたならなぜ"%f"にangleの値が代入されるのでしょうか?

No.1とNo.2との関係性が全く分かりません。

それとfontDraw関数内のglPushMatrix関数とglPopMatrix関数の存在の意味があまりわかりませんでした。
上の2つの関数をコメントしても実行結果が同じでした。なので、もしかしたら動画で紹介してる描画以外の処理で必要になるのかな?と思ったのですが、このような考えでよろしいでしょうか?

ちなみに下にソースコードを記載しました。(多分....)
上記の問題のソースコードは
/*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
で囲ってあります。
今回初めて投稿させていただいて、やり方があっていなかったらすみません。<(_ )>
ソースコードがゴッチャになってしまいすみません。
どなたかわかる方教えてください。<(
_)>
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

//main.cpp

#include <stdio.h> #include <stdlib.h> #include "glm/glm.hpp" #include "glut.h" #include "font.h" using namespace glm; ivec2 windowSize = {1000,600};//vec x,y bool keys[256]; void display(void) { glClear(GL_COLOR_BUFFER_BIT);// GLbitfield mask glMatrixMode(GL_PROJECTION);// GLenum mode glLoadIdentity(); gluOrtho2D( 0, windowSize.x, // GLdouble left, right windowSize.y, 0); // GLdouble bottom, top glMatrixMode(GL_MODELVIEW);// GLenum mode glLoadIdentity(); glTranslatef(windowSize .x/2, windowSize .y/2,0);//GLfloat x, y, z static float angle; if (keys['d']) angle += 1; if (keys['a']) angle -= 1; glRotatef( angle, // GLfloat angle 0, 0, 1); // GLfloat x, GLfloat y, GLfloat z:回転軸 glScalef(256, 256, 1);//GLfloat x, y, z glutWireTeapot(1.0);// GLdouble size fontBegin(); fontSetColor(0,0xff,0); fontSetPosition(0,windowSize.y - fontGetSize()*1.5); fontSetSize(FONT_DETAULT_SIZE/2); //問題の関数 /*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ fontDraw("angle:%f", angle); -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ fontEnd(); glutSwapBuffers(); } void timer(int value) { glutPostRedisplay(); glutTimerFunc( 1000/60, // unsigned int millis timer, // void (GLUTCALLBACK *func)(int value) 0 // int value ); } void reshape(int width, int height) { //printf("reshape: width: % d height; % d\n",width,height); glViewport( //ビュー ポート変換 0,0, // GLint x, GLint y width,height// GLsizei width, GLsizei height ); windowSize = ivec2(width, height); } void Keyboard(unsigned char key, int x, int y) { if (key == 0x1b) exit(0);//プログラム終了 keys[key] = true; } void KeyboardUp(unsigned char key, int x, int y) { printf("KeyboardUp: \'%c\'(%#x)\n", key, key); keys[key] = false; } int main(int argc, char* argv[]) { glutInit( &argc,// int *argcp argv// char **argv ); glutInitDisplayMode(GL_DOUBLE);// unsigned int mode glutInitWindowPosition(0, 0);// int x,y glutInitWindowSize(windowSize.x, windowSize.y);// int width, height glutCreateWindow("Title");// const char *title glutDisplayFunc(display); glutTimerFunc( 0, // unsigned int millis timer, // void (GLUTCALLBACK *func)(int value) 0); // int value glutKeyboardFunc(Keyboard); glutReshapeFunc(reshape); glutKeyboardUpFunc(KeyboardUp); glutIgnoreKeyRepeat(GL_TRUE);// int ignore glutMainLoop(); }

//font.cpp

#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include "font.h" #include "glut.h" #include "glm/glm.hpp" using namespace glm; static vec2 position; static float size = FONT_DETAULT_SIZE; static unsigned char color[3]; void fontBegin() { glPushMatrix(); glPushAttrib(GL_ALL_ATTRIB_BITS);//GLbitfield mask glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLint viewport[4]; glGetIntegerv( GL_VIEWPORT,// GLenum pname viewport); // GLint* params gluOrtho2D( 0, viewport[2], // GLdouble left, right viewport[3], 0); // GLdouble bottom, top glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); } void fontEnd() { glPopMatrix(); glPopAttrib(); } void fontSetPosition(float _x, float _y) { position = vec2(_x, _y); } void fontSetSize(float _size) { size = _size; } float fontGetSize() { return size; } void fontSetColor(unsigned char _red, unsigned char _green, unsigned char _blue) { color[0] = _red; color[1] = _green; color[2] = _blue; } //問題の関数 /*-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ void fontDraw(const char *_format, ...){ va_list argList; va_start(argList, _format); char str[256]; vsprintf_s( str, // char buffer: _format, // char const*, _Format: argList);// va_list, _ArgList va_end(argList); glColor3ub(color[0], color[1], color[2]);//GLbyte red, green, blue glPushMatrix(); { glTranslatef(position.x,position.y+size,0);//GLfloat x, y, z float s = size/FONT_DETAULT_SIZE; glScalef(s, -s, s);//GLfloat x, y, z for (char* p = str; *p != NULL; p++) { glutStrokeCharacter(GLUT_STROKE_ROMAN, *p); } glPopMatrix(); } } -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/ }

//font.h

#pragma once #define FONT_DETAULT_SIZE (100.f) void fontBegin(); void fontEnd(); void fontSetPosition(float _x, float _y); void fontSetSize(float _size); float fontGetSize(); void fontSetColor(unsigned char _red, unsigned char _green, unsigned char _blue); void fontDraw(const char *_format,...);

環境visual studio C++

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
glut-3.7.6-zip(117KB)
g-truc/glm:0.9.9-a2
参考:Youtube ゲーム道館「OpenGL道場 第7回「文字列」
https://www.youtube.com/watch?v=mnH_w0rkndY&list=PL8_ASIpg7ciG3btmV6RElRjmWrfAL0q2P&index=7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

angleは"%f"に代入されるのでしょうか?

違います"%f"はフォーマット指定子です。
なので実数として読み込むことを指定しています。結果はangle(&いらないのか?)に読み込まれます。

関数の対応は・・・
(const char *_format, ...)

("angle:%f", angle)

"angle:%f"←const char *_format
angle←... 可変長ですが引数は1個です

投稿2020/02/02 22:05

編集2020/02/02 22:06
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/02/03 00:31 編集

ソースが読み難いので、printf()での解説になっています。誤解があれば訂正します。 angleが(floatの)配列もしくはポインタでない場合、この記述は間違いです。
hikar

2020/02/09 11:00

ご返答ありがとうございました。(>_<)
guest

0

ベストアンサー

質問1
可変長引数で、平たく言えば、引数をいくつでも付け加えることができます。
printfとほぼ同等です

質問2
printfがそういう仕組だから、です
おそらく内部でvsprintfに引き渡していると思います。

glPushMatrix/glPopMatrix
glPushMatrixで使う前の情報を保存しておき、glPopMatrixで使う前の状態に復元します
現在の設定をいじってしまうと、このあとに使う関数で問題が起きる可能性があります
これを取り除いても問題なく動くのは、たまたま後ろの処理で問題を起こす処理がなかっただけです

あとソースは前後に「```」という行で挟みます
あとからでも編集ボタンで修正できますので、直しておいてください

投稿2020/02/02 17:28

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikar

2020/02/03 13:31

なるほど! 何とか理解することができました。 投稿も再編集させていただき、ソースコードを```で囲みました。 またわからないことがあったら質問させていただきます。よろしくお願いします。(^^)/ 色々教えていただきありがとうございました。<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問