我正在尝试编写现代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,6 * 2 * 3); //And these next 2 lines glCullFace(save_cull_mode); glDepthFunc(save_depth_mode); glUseProgram(0);
这段代码,你可能意识到,绘制一个天空盒.其中一部分是禁用剔除(所以我们可以看到内部的框),并改变深度功能(基本上是优化,其中一部分在着色器中,部分在这里).我想保存并恢复这些值,但是由于我不能使用gl [Push / Pop] Attrib,我必须自己做.这不仅仅是两个属性,而且如果我用得更多,这很快就会变成一个巨大的痛苦(据我所知,缓慢,因为glGet *不是很快).我读到push / pop函数被弃用,因为它们主要用于处理FFP状态,但是这显然不是FFP状态,而push / pop函数将很适合使用.应该用什么呢?还是要deal with it?
解决方法
我认为这个论坛的帖子opengl.org几乎总结了:
http://www.opengl.org/discussion_boards/showthread.php/173957-glPushAttrib-depreciated-replace-by
基本上OpenGL状态预计由客户端处理,因为随着移动到着色器,大部分属性将被存储在您的程序中.这是从OpenGL中删除旧的固定功能管道的一部分.