Я пытаюсь написать современный 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 отлично подходят для использования. Что я должен использовать вместо этого? Или мне нужно просто справиться с ним?