2014-01-11 16 views
10

Ich versuche, moderne OpenGL zu schreiben, aber habe etwas getroffen, das mich nervt.Da glPushAttrib/glPopAttrib veraltet ist, wie können Attribute wie GL_DEPTH_FUNC neu gespeichert werden?

Ich habe dieses Stück Code:

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

Dieser Code, wie Sie wahrscheinlich realisiert, zieht eine Skybox. Ein Teil davon ist Deaktivieren von Culling (so dass wir die Box sehen können, während es drin ist) und Ändern der Tiefe Func (im Grunde eine Optimierung, von denen ein Teil im Shader und Teil hier ist). Ich möchte diese Werte speichern und wiederherstellen, aber weil ich gl[Push/Pop]Attrib nicht verwenden kann, muss ich es selbst tun. Dies ist keine große Sache mit nur zwei Attributen, aber wenn ich mehr verwendet, würde dies schnell zu einem großen Schmerz werden (und, wie ich es verstehe, langsam, da glGet* nicht sehr schnell ist). Ich habe gelesen, dass die Push/Pop-Funktionen veraltet waren, weil sie hauptsächlich verwendet wurden, um den FFP-Zustand zu behandeln, aber dies ist offensichtlich kein FFP-Zustand und dennoch wären die Push/Pop-Funktionen gut geeignet. Was sollte ich stattdessen verwenden? Oder muss ich nur deal with it?

+0

Wickeln Sie Ihre Statusverwaltung ein. Wenn Sie 'glDepthFunc (...)' nicht direkt aufrufen, sondern eine Ebene darüber schreiben, können Sie den Zustand immer kennen, ohne ihn abfragen zu müssen. –

+0

Wahrscheinlich existiert eine solche Ebene bereits im Treiber, um einen Hin- und Rückweg zur GPU zu vermeiden (wenn Sie mehrere Aufrufe in einer Reihe machen, die denselben Tiefen-/Cull-Modus einstellen). Abgesehen davon könnten Sie C++ und RAII verwenden. 'class DepthFuncSetter {public: DepthFuncSetter (GLenum f) {glGetIntegerv (GL_DEPTH_FUNC, & m_oldSetting); glDepthFunc (f); } ~ DepthFuncSetter() {glDepthFunc (m_oldSetting); } privat: GLenum m_oldSetting; }; ' – peppe

+0

Ich benutze C, leider kann ich RAII nicht benutzen. Ich denke, ich könnte eine Art Handler in dieser Richtung schreiben, aber ich hatte gehofft, dass da etwas eingebaut ist. – Rotten194

Antwort