我正在尝试编写现代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?
答案 0 :(得分:4)
我认为这个关于opengl.org的论坛帖子总结了很多:http://www.opengl.org/discussion_boards/showthread.php/173957-glPushAttrib-depreciated-replace-by
基本上OpenGL状态应该由客户端处理,因为移动到着色器时,大多数属性都会存储在程序中。这是从OpenGL中删除旧的固定功能管道的一部分。