【问题标题】:I'm trying to change the colour of the background but it's not working我正在尝试更改背景的颜色,但它不起作用
【发布时间】:2019-10-29 09:01:05
【问题描述】:

我正在尝试使用 c++ 学习 opengl,并且正在尝试更改背景的颜色。这是我目前得到的代码

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void display();

void init()
{
    glClearColor(1.0, 1.0, 0.0, 1.0);
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);

    glutInitWindowPosition(200, 100);
    glutInitWindowSize(500, 500);

    glutCreateWindow("Window 1");

    glutDisplayFunc(display);
    init();

    glutMainLoop();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glFlush();
}

当我运行它时,我只是得到一个没有颜色的黑色窗口。谁能告诉我我做错了什么

【问题讨论】:

  • 我之前没用过glut,但是貌似只有在窗口损坏的情况下才使用Display func。改用 glutIdleFunc 试试?
  • 我已经尝试替换它,但现在我得到一个错误,因为没有显示回调
  • 看看GLUT examples,您似乎可以在空闲函数中简单地调用glutPostRedisplay()
  • @Botije 你的意思是在初始化函数的末尾编辑:我试着把它放在初始化函数的末尾,但它仍然显示一个黑色窗口
  • glutIdleFunc 指向一个只调用glutPostRedisplay() 的函数。将glutDisplayFunc 指向您的display 函数。

标签: c++ opengl glut


【解决方案1】:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void display();
void idle();

void init()
{
    glClearColor(1.0, 1.0, 0.0, 1.0);
}

int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);

    glutInitWindowPosition(200, 100);
    glutInitWindowSize(500, 500);

    glutCreateWindow("Window 1");

    glutDisplayFunc(display);
    glutIdleFunc(idle); // added this
    init();

    glutMainLoop();
}

void idle()
{
    glutPostRedisplay(); // tell glut we're overdue for a redraw.
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    glFlush();
}

【讨论】:

  • 我试过了,但现在我得到了这个Process terminated with status -1073741819 (0 minute(s), 3 second(s))
  • 附加一个调试器,然后看看它为什么会崩溃。这是直接从我链接到的“搅拌机”示例中提取的。
  • 我附加了一个调试器,它说没有错
  • 不,它仍然只是一个普通的黑色窗口
  • 您是否进行了干净的重建?我开始怀疑您忽略了编译错误并使用旧版本运行。
【解决方案2】:

您没有指定双缓冲区设置(GLUT_DOUBLE 或 GLUT_SINGLE)。默认使用 GLUT_SINGLE。

glutInitDisplayMode(GLUT_RGB);

但是,有些驱动程序不允许单个缓冲区窗口。

我推断这是正在发生的事情。尝试添加一个 glutSwapBuffers() 而不是 glFlush()。

glutSwapBuffers(); // glFlush

您的窗口正在显示前端缓冲区,但您正在清除后端缓冲区,该缓冲区永远不会被复制到前端缓冲区。

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 2014-04-09
    • 2016-10-04
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2012-12-24
    相关资源
    最近更新 更多