Поскольку glPushAttrib/glPopAttrib устарели, каков новый способ сохранения таких атрибутов, как GL_DEPTH_FUNC?

Я пытаюсь написать современный OpenGL, но ударил то, что меня беспокоит.

У меня есть этот бит кода:

glUseProgram(skybox_program->id);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->id);
    glUniform1i(get_program_uniform(skybox_program, "cubemap_tex"), 1);
    //From here
    GLint save_cull_mode, save_depth_mode;
    glGetIntegerv(GL_CULL_FACE_MODE, &save_cull_mode);
    glGetIntegerv(GL_DEPTH_FUNC, &save_depth_mode);
    glCullFace(GL_FRONT);
    glDepthFunc(GL_LEQUAL);
    //To here
        glUniformMatrix4fv(get_program_uniform(skybox_program, "camera"), 1, GL_FALSE, cam_rot.mat);
        glBindVertexArray(skybox_vao);
        glDrawArrays(GL_TRIANGLES, 0, 6 * 2 * 3);
    //And these next 2 lines
    glCullFace(save_cull_mode);
    glDepthFunc(save_depth_mode);
glUseProgram(0);

Этот код, как вы, вероятно, поняли, рисует skybox. Частью этого является отключение отбраковки (так что мы можем видеть окно внутри него) и изменение глубины func (в основном оптимизация, часть которой находится в шейдере и части здесь). Я хочу сохранить и восстановить эти значения, но поскольку я не могу использовать gl[Push/Pop]Attrib, я должен сделать это сам. Это не имеет большого значения только с двумя атрибутами, но если бы я использовал больше, это быстро стало бы огромной болью (и, как я понимаю, медленной, так как glGet* не очень быстро). Я читал, что функции push/pop были устаревшими, потому что они в основном использовались для управления состоянием FFP, но это, очевидно, не состояние FFP, и все же функции push/pop отлично подходят для использования. Что я должен использовать вместо этого? Или мне нужно просто справиться с ним?

Ответ 1

Я думаю, что это сообщение в форуме на opengl.org в значительной степени подводит итог: http://www.opengl.org/discussion_boards/showthread.php/173957-glPushAttrib-depreciated-replace-by

Как правило, состояние OpenGL будет обрабатываться клиентом, потому что при переходе к шейдерам большинство атрибутов будет храниться в вашей программе в любом случае. Это часть нажатия для удаления старого конвейера с фиксированной функцией из OpenGL.