цвет фона в opengl - PullRequest
       14

цвет фона в opengl

9 голосов
/ 24 мая 2010

Я хочу изменить цвет фона окна после нажатия кнопки, но моя программа не работает, может кто-нибудь сказать мне, почему, заранее спасибо

int main(int argc, char* argv[])
    {
        glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(800, 600);
        glutInitWindowPosition(300,50);
    glutCreateWindow("GLRect");

glClearColor(1.0f, 0.0f, 0.0f, 1.0f);   <---

    glutDisplayFunc(RenderScene);
        glutReshapeFunc(ChangeSize);
    glutMainLoop();

    system("pause");
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);   <---

        return 0;
    }

Ответы [ 2 ]

18 голосов
/ 24 мая 2010

glClearColor не выполняет самоочищение - оно просто устанавливает, каким будет цвет, когда вы действительно очищаете. Чтобы выполнить очистку, вам нужно позвонить glClear с (как минимум) COLOR_BUFFER_BIT.

Редактировать: прошло довольно много времени с тех пор, как я использовал перенасыщение, поэтому детали могут быть неверными, но если память не изменяет цвет экрана в ответ на нажатие клавиши на клавиатуре, вы должны сделать что-то вроде это:

void keyboard (unsigned char key, int x, int y)
{
    // we'll switch between red and blue when the user presses a key:
    GLfloat colors[][3] = { { 0.0f, 0.0f, 1.0f}, {1.0f, 0.0f, 0.0f } };
    static int back;

    switch (key) {
    case 27: 
        exit(0);
    default:
        back ^= 1;
        glClearColor(colors[back][0], colors[back][1], colors[back][2], 1.0f);
        glutPostRedisplay();
    }
}

void draw() { 
    glClear(GL_COLOR_BUFFER_BIT);
    // other drawing here...
}

int main() { 

    // glutInit, glutInitDisplayMode, etc.

     glutDisplayFunc(draw);
     glutKeyboardFunc(keyboard);
     glutMainLoop();
}

По сути, вы делаете все свои рисунки в любой функции, которую вы передаете glutDisplayFunc. Почти все остальное просто меняет состояние, а затем вызывает PostRedisplayFunc();, чтобы сообщить glut, что окно необходимо перерисовать. Предупреждение: как я уже сказал, прошло много времени с тех пор, как я использовал glut, и я не тестировал этот код. Насколько я помню, он показывает общую структуру программы перенасыщения, но не ожидайте, что она будет работать так, как есть.

0 голосов
/ 24 мая 2010

Я думаю, у вас нет контекста OpenGL в тот момент, когда вы называете glClearColor.

Но ...

... Я никогда раньше не использовал перенасыщение, поэтому быстрый взгляд на документы показывает, что у вас действительно будет контекст после glutCreateWindow, так что, возможно, это не так.

Поскольку мой комментарий к вашему вопросу говорит, что мне любопытно узнать второй звонок по номеру glClearColor и как вы думаете, вы его достигнете. Это, скорее всего, причина проблемы. Чтобы сделать что-нибудь по нажатию клавиши, я считаю, что вам нужно зарегистрировать обратный вызов, используя glutKeyboardFunc.

...