opengl&glutのmain関数について(c++)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tim
記事: 5
登録日時: 10年前

opengl&glutのmain関数について(c++)

#1

投稿記事 by tim » 10年前

先日 文字表示について伺いましたがまたまた調べても分からない問題に直面しましたorz 下に貼ってるコードは私が現在使っているパソコンでは問題なく動くのですが、display関数内のglflushをglutSwapBuffersに変更すると何故か真っ白になってしまいます。(windowの大きさを変えると画面内を白色で塗りつくさないのでglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)も動いてないdisplay関数自体止まってしまう)
また手抜きopenglを参考にしてglutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)をgluiinitの後ろにおいても同じ現象が起こってしまいます。 これは何故でしょうか 私の調べた範囲では説明がありませんでした。 恐らくダブルバッファ・モードになってないためglutswapbuffersが仕事をしてくれないからだと思います。。。
 
申し訳ありません glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);を先頭においた状態でdisplay関数内のglflushをglutSwapBuffersに変更したら問題が解決しました。 
 以下が正常に動いたコードで開発環境はvisual studioです osはwindows7です。

コード:

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include<math.h>
////////////////////////////////////////////
//円周率
const double PI= 3.14159;
#define N 256
//ウィンドウの大きさ
double W=300;
double H=300;
//フォント
void *font = GLUT_BITMAP_HELVETICA_18;
char s1[N] = {'\0'};
 
GLfloat red[]={1,0,0,0};
// 初期の振り子の角度と角速度
double r=0,ω=90;
//ラジアンに変換
double x=r*PI/180;
double v=ω*PI/180;
//振り子の糸の長さと重力定数
const double l=1;
const double g=9.8;
double t=0;
//////////////////////////////////////////////
 
//運動方程式
double f1(double t,double x,double v){
	return -(g/l)*sin(x);
}
 
//ルンゲクッタ法
void calculate(){
	double dt=0.01;
	double k1=0,k2=0,k3=0,k4=0;
	k1=dt*f1(t,x,v);
    k2=dt*f1(t+dt/2.0,x+k1/2.0,v+k1/2.0);
    k3=dt*f1(t+dt/2.0,x+k2/2.0,v+k2/2.0);
    k4=dt*f1(t+dt,x+k3,v+k3);
 
	v+=(k1+2.0*k2+2.0*k3+k4)/6.0;
 
	x+=v*dt;
 
    r=x*180/PI;  
	t+=dt;
	sprintf_s(s1, "%lf", t);
 
}
//文字表示関数
void render_string(float s, float k, const char* string){
	float z = -1.0f;
	glColor3f(1,0,0);
	glRasterPos3f(s, k, z);
	char* p = (char*) string;
	while (*p != '\0') glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *p++);
}
 
 
void display(){
 
 
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
 
 
	render_string(-0.8, 0.8, "OpenGL");
	render_string(-0.9, 0.7, "t=");
	render_string(-0.8, 0.7, s1);
 
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
	glTranslated(0,l,0);
	glRotated(r,0,0,1);
	glTranslated(0,-l,0);
	glBegin(GL_LINES);
	glVertex3d(0,l,0);
	glVertex3d(0,0,0);
	glEnd();
	glutSolidSphere(l/10,30,30);
 
 
	glFlush();
}
 
void init(){
	glClearColor(1,1,1,1);
	glEnable(GL_DEPTH_TEST);

	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
}
 
void resize(int w,int h){
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30,(double)w/(double)h,1,100);
	gluLookAt(0,l/2,3,0,l/2,0,0,1,0);
	glMatrixMode(GL_MODELVIEW);
	display();
 
}
 
void timer(int value){
	glutPostRedisplay();
	calculate();
	glutTimerFunc(10 , timer , 0);
}
 
 
int main(int argc, char *argv[]){
	
	glutInit(&argc, argv);
	glutInitWindowSize(W,H);
	
	glutCreateWindow("振り子");
	glutDisplayFunc(display);
	glutReshapeFunc(resize);
	glutTimerFunc(0,timer,0);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	
	init();
 
	glutMainLoop();
	return 0;
}
 

“C言語何でも質問掲示板” へ戻る