繁体   English   中英

OpenGL闪烁屏幕

[英]OpenGL flickering screen

我已经在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();
}

如果您不进行任何形式的v-sync,这可能是由于撕裂所致(这看起来不像您的代码)。 尝试在显示方法中增加一个睡眠时间(例如sleep(500))。 这不是解决此问题的正确方法,但这将使您能够验证问题所在。 如果是这样,请考虑将v-sync添加到您的应用程序。

  • gluLookAt()乘以当前矩阵,它不会加载新的矩阵。 多个gluLookAt()相乘不是很有意义。
  • 每帧重新加载项目/模型视图矩阵,有助于防止矩阵出现异常。
  • 让GLUT完成工作,不要从idle()调用display() idle() ,而应使用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM