Восстановление OpenGL State

Я хочу написать служебную функцию общего назначения, которая будет использовать объект OpenGL Framebuffer для создания текстуры, которая может использоваться какой-либо программой OpenGL для любых целей, которые захотят сторонние программисты.

Скажем, для аргумента кола функция выглядит так

void createSpecialTexture(GLuint textureID)
{
MyOpenGLState state;
saveOpenGLState(state);
setStateToDefault();
doMyDrawing();
restoreOpenGLState(state);
}

Что должно MyOpenGLState, saveOpenGLState(state), setStateToDefault() а также restoreOpenGLState(state) похоже, чтобы убедиться, что doMyDrawing будет вести себя правильно, и это ничего, что я делаю в doMyDrawing повлияет на что-либо еще, что может делать сторонний разработчик?

Проблема, которая меня кусала, заключается в том, что OpenGL имеет много неявных состояний, и я не уверен, что все это фиксирую.

Обновить: Моя главная проблема — OpenGL ES 2.0, но я подумал, что задам вопрос более широко

5

Решение

Не используйте объект framebuffer для рендеринга вашей текстуры. Скорее создайте новый EGLContext и EGLSurface. Вы можете использовать eglBindTexImage превратить вашу поверхность EGLS в текстуру. Таким образом, вам гарантировано это состояние от doMyDrawing не загрязнит основной контекст и наоборот.

1

Другие решения

Что касается сохранения и восстановления, glPushAttrib а также glPopAttrib очень далеко

Однако вы не можете восстановить GL до состояния по умолчанию. Тем не менее, так как doMyDrawing() использует и / или изменяет только то состояние, которое должно быть вам известно, вы можете просто установить для него значения, которые вам нужны.

0

Это во многом зависит от того, что вы делаете на вашем doMyDrawing();, но в основном вы должны восстановить все (все состояния), которые вы изменяете в этой функции. Не глядя на то, что происходит внутри doMyDrawing(); невозможно угадать, что нужно восстановить.

Если изменения в матрице проекции или модели сделаны внутри doMyDrawing(), не забудьте идти сначала толкать оба GL_PROJECTION а также GL_MODELVIEW матрица через glPushMatrix и восстановить их после прорисовки glPopMatrix, Любое другое состояние, которое вы изменяете, может быть как push, так и pop glPushAttrib и правильный атрибут. Не забудьте также отсоединить любую текстуру, FBO, PBO и т. Д., Которую вы можете связать внутри doMyDrawing ();

0
По вопросам рекламы [email protected]