2014-01-11 87 views
10

我正在尝试写现代的OpenGL,但碰到了一些让我感到困扰的东西。由于glPushAttrib/glPopAttrib不推荐使用,保存属性如GL_DEPTH_FUNC的新方法是什么?

我有这段代码:

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); 

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

+0

包装你的国家管理。如果不是直接调用'glDepthFunc(...)',而是在它上面编写一个图层,您始终可以知道状态而不必查询它。 –

+0

驱动程序中可能已经存在这样的图层,以避免往返于GPU(如果您在设置相同的深度/剔除模式下连续执行多个调用)。除此之外,你可以使用C++和RAII。 'class DepthFuncSetter {public:DepthFuncSetter(GLenum f){glGetIntegerv(GL_DEPTH_FUNC,&m_oldSetting); glDepthFunc(F); }〜DepthFuncSetter(){glDepthFunc(m_oldSetting); } private:GLenum m_oldSetting; };' – peppe

+0

我正在使用C,所以很伤心我不能使用RAII。我想我可以写一些类似的处理程序,但我希望有内置的东西。 – Rotten194

回答

相关问题