Это очень похоже на переключение контекста для ЦП для выполнения расписания потоков.
Допустим, у вас есть два конвейера M и N в одном потоке, и M запускается первым, когда вы хотите переключиться на N, вы можете сохранить M сначала контекст, а затем запустить конвейер N, и в какой-то момент, когда N работает, вы можете сохранить контекст N и восстановить контекст M. Итак, вопрос в том, как явно сохранить контекст OpenGL.
На самом деле OpenGL предоставляет множество методов запроса / получения (или несколько методов, но много параметров), например glGetIntegerv
, glGetVertexAttribiv
и glGetVertexAttribPointerv
( glGet ), вы можете запросить и сохранить результат где-нибудь и восстановить их в какой-то момент.
Вот простой пример класса-оболочки:
class GLStateSaver {
GLuint framebuffer;
GLint activeTexture;
GLint boundedTextures[MAX_USED_TEXTURES];
// ... add more fields if you need, like programID, memory object id etc.
public:
void Save() {
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &framebuffer);
glGetIntegerv(GL_ACTIVE_TEXTURE, &activeTexture);
// ...
}
void Restore() {
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glActiveTexture(activeTexture);
// ...
}
}