前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/03 00:31 編集
2020/02/09 11:00