ページ 11

glutsetoptionを使ったループ抜けをしたい

Posted: 2020年12月24日(木) 15:44
by sahaya
openglのfreeglutを使ってglutmainlopp()のループ抜けをしたいと思い以下のサイト(https://seesaawiki.jp/w/mikk_ni3_92/d/freeglut%ca%d403)を参考にしたところコンパイルは通ったもののコマンドプロント上で以下のようなエラーが発生しました
glutinitで初期化を行った後にglutSetOptionを使用しているのにも関わらずエラーが出ている理由が分かりません。
解決よろしくお願いします。

使用した言語C++
開発環境Visual studio 2019

エラー内容

コード:

freeglut ERROR: Function <glutSetOption> called without first calling 'glutinit'

コード:

#include <GL/freeglut.h>
#include <cstdio>

//----------- プロトタイプ宣言 --------------//
void display();
void reshape(int w, int h);
void timer(int value);


//------------- OpenGLの初期設定 ------------------//
void GLUT_INIT()
{
    glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); //ダブルバッファ、Zバッファ
    glutInitWindowSize(640,480);
    glutCreateWindow("glutSetOption");
}

void GLUT_CALL_FUNC()
{
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutTimerFunc(0,timer,17);
}

void MY_INIT()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glEnable(GL_DEPTH_TEST);//ZバッファON
}



//------------- メイン関数 ----------------//
int main(int argc, char **argv)
{
    glutInit(&argc,argv);

    GLUT_INIT();
    GLUT_CALL_FUNC();
    MY_INIT();
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_GLUTMAINLOOP_RETURNS);
    glutMainLoop();
    puts("Back from the free glutMainloop()");
    return 0;
}

//------------ ここからコールバック関数 ------------------//
void display()
{
    static int r = 0;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


    glColor3f(0,0,1);

    glPushMatrix();
    glRotatef(float(r), 0.0, 1.0, 0.0);
    static double data[]={0,0,0}; //オフセット
    glutWireSierpinskiSponge(2,data,1);//シェルピンスキーの四面体
    glPopMatrix();

    glColor3f(1,1,1);

    glutSwapBuffers();

    if(++r > 360){
        r= 0;
    }
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION); //行列モード切替
    glLoadIdentity();  //行列初期化
    gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);

    glMatrixMode(GL_MODELVIEW); //行列モード切替
    glLoadIdentity();
    gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void timer(int t)
{
    glutPostRedisplay();
    glutTimerFunc(t,timer,17); //タイマー関数
}

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2020年12月24日(木) 18:19
by Meta3
コンパイル リンク 実行 と全く問題なく動きました
Windows10 VisualStudio2019  freeglut.3.0.0.v140で確認
三角の立体(3面、中にも図形))が回転してますね
環境がうまく構築されていないのか?

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2020年12月24日(木) 22:17
by あたっしゅ
 グラボ(NVIDIA GeForce なんたら とか)や openGL のドライバのバーションを公表すると吉。

 オープンソフトな 3DCG アプリ Blender の 2.80 以降は、
openGL のバーションが低い Intel グラフィックな Note PCで動かなくなりました。

 うちでも、コンパイル リンク 実行 と全く問題なく動きました。
 Windows10 PRO(x64) VisualStudio 2019 で確認。freegl のバーションは未確認。
NVIDIA GTX GeForce GTX 1070 Ti

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2020年12月25日(金) 05:24
by あたっしゅ
 バックアップ中に、寝ちまったい。

Intel(R) HD Graphics
Intel(R) Core(TM) i3 CPU M330 @ 2.13GHz 2.13GHz



The following required OpenGL extensions missing:
GL_ARB_multitexture
GL_ARB_vertex_buffer_object
GL_EXT_geometry_shader4.

となりましたので、原因は、グラボが弱すぎるですかね。

 ワイヤーフレームを動かすだけなら、古い openGL/freeglut のライブラリ使えば動くかな ?

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2021年1月10日(日) 05:19
by sahaya
あたっしゅ さんが書きました:
3年前
 グラボ(NVIDIA GeForce なんたら とか)や openGL のドライバのバーションを公表すると吉。
解答ありがとうございます。
確認したところopenglのドライバのVersionは4.2でした。

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2021年1月10日(日) 05:22
by sahaya
あたっしゅ さんが書きました:
3年前


となりましたので、原因は、グラボが弱すぎるですかね。

解答ありがとうございます。
グラボはIntel(R) HD Graphics 4400でした。

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2021年1月10日(日) 05:28
by sahaya
Meta3 さんが書きました:
3年前
環境がうまく構築されていないのか?
解答ありがとうございます。

コード:

#include <Gl/freeglut.h>
#include <iostream>

void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glutSwapBuffers();
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutCreateWindow("GLUT");
	glutDisplayFunc(display);
	glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
	std::cout << "Before glutMainLoop()!" << std::endl;
	glutMainLoop();
	std::cout << "Back in main()!" << std::endl;
	return 0;
}
こちらのコードからglutsetoption()を省いた時にはしっかり出力できているのでfreeglutの環境構築ができてないかもしれませんね。
また一から構築してみます。
分かりやすいサイトがあれば教えてくれるとありがたいです。

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2021年1月10日(日) 10:07
by Meta3
VisualStudio2019 であればツールのNuGetのパッケージ・マネージャを使えば数十秒で構築してくれると思います

Re: glutsetoptionを使ったループ抜けをしたい

Posted: 2021年1月12日(火) 00:29
by sahaya
NuGetのパッケージ・マネージャを使ったところしっかりと出力できました!
皆さん丁寧な解答ありがとうございました!!