gpt4 book ai didi

c++ - OpenGL 闪烁屏幕

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:53 26 4
gpt4 key购买 nike

我编写了一个在我的 ubuntu 笔记本电脑上运行的简单 opengl。它是一个包括太阳和地球在内的小太阳系,地球绕着太阳转。我的程序的问题是每次我尝试运行它时屏幕都会不断闪烁。

#include <GL/glut.h>
#define SUN_RADIUS 0.4
#define EARTH_RADIUS 0.06
#define MOON_RADIUS 0.016

GLfloat EARTH_ORBIT_RADIUS = 0.9;
GLfloat year = 0.0;

void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


void renderScene() {
gluLookAt(
0.0, 0.0, -4.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0
);
glColor3f(1.0, 1.0, 0.7);
glutWireSphere(SUN_RADIUS, 50, 50);
glPushMatrix();

glRotatef(year, 0.0, 1.0, 0.0);
glTranslatef(EARTH_ORBIT_RADIUS, 0.0, 0.0);

glColor3f(0.0, 0.7, 1.0);
glutWireSphere(EARTH_RADIUS, 10, 10);

glPopMatrix();
}

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

void idle() {
year += 0.2;
display();
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("Solar System");

init();
glutDisplayFunc(display);
glutIdleFunc(idle);

glutMainLoop();
}

最佳答案

  • gluLookAt() 乘以当前矩阵,它不会加载新矩阵。多个 gluLookAt() 相乘不是很有意义。
  • 每帧重新加载 proj/modelview 矩阵,有助于防止矩阵异常。
  • 让 GLUT 完成它的工作,不要从 idle() 调用 display(),而是使用 glutPostRedisplay()。这样 GLUT 就知道下次通过事件循环调用 display()

一起:

#include <GL/glut.h>

#define SUN_RADIUS 0.4
#define EARTH_RADIUS 0.06
#define MOON_RADIUS 0.016

GLfloat EARTH_ORBIT_RADIUS = 0.9;
GLfloat year = 0.0;

void renderScene()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( -1, 1, -1, 1, -100, 100 );

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt
(
0.0, 0.0, -4.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0
);

glColor3f(1.0, 1.0, 0.7);
glutWireSphere(SUN_RADIUS, 50, 50);

glPushMatrix();
glRotatef(year, 0.0, 1.0, 0.0);
glTranslatef(EARTH_ORBIT_RADIUS, 0.0, 0.0);
glColor3f(0.0, 0.7, 1.0);
glutWireSphere(EARTH_RADIUS, 10, 10);
glPopMatrix();
}

void display()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(10.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderScene();
glutSwapBuffers();
}

void idle()
{
year += 0.2;
glutPostRedisplay();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("Solar System");

glutDisplayFunc(display);
glutIdleFunc( idle );

glutMainLoop();
}

关于c++ - OpenGL 闪烁屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30129416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com