由于不推荐使用glPushAttrib / glPopAttrib,保存GL_DEPTH_FUNC等属性的新方法是什么?

时间:2014-01-11 18:54:35

标签: c opengl shader deprecated opengl-3

我正在尝试编写现代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);

您可能已经意识到,此代码会绘制一个天空盒。部分原因是禁用剔除(所以我们可以在里面看到方框)并更改深度功能(基本上是优化,其中一部分在着色器中,部分在此处)。我想保存并恢复这些值,但由于我不能使用gl[Push/Pop]Attrib,我必须自己做。这对于两个属性来说并不是什么大不了的事,但如果我使用更多属性,这很快就会变成一个巨大的痛苦(据我所知,慢,因为glGet*不是很快)。我读到推送/弹出功能已被弃用,因为它们主要用于处理FFP状态,但这显然不是FFP状态,但推/弹功能非常适合使用。我应该用什么呢?或者我必须只是deal with it

1 个答案:

答案 0 :(得分:4)

我认为这个关于opengl.org的论坛帖子总结了很多:http://www.opengl.org/discussion_boards/showthread.php/173957-glPushAttrib-depreciated-replace-by

基本上OpenGL状态应该由客户端处理,因为移动到着色器时,大多数属性都会存储在程序中。这是从OpenGL中删除旧的固定功能管道的一部分。