Я хочу написать служебную функцию общего назначения, которая будет использовать объект 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, но я подумал, что задам вопрос более широко
Не используйте объект framebuffer для рендеринга вашей текстуры. Скорее создайте новый EGLContext и EGLSurface. Вы можете использовать eglBindTexImage
превратить вашу поверхность EGLS в текстуру. Таким образом, вам гарантировано это состояние от doMyDrawing
не загрязнит основной контекст и наоборот.
Что касается сохранения и восстановления, glPushAttrib
а также glPopAttrib
очень далеко
Однако вы не можете восстановить GL до состояния по умолчанию. Тем не менее, так как doMyDrawing()
использует и / или изменяет только то состояние, которое должно быть вам известно, вы можете просто установить для него значения, которые вам нужны.
Это во многом зависит от того, что вы делаете на вашем doMyDrawing();
, но в основном вы должны восстановить все (все состояния), которые вы изменяете в этой функции. Не глядя на то, что происходит внутри doMyDrawing();
невозможно угадать, что нужно восстановить.
Если изменения в матрице проекции или модели сделаны внутри doMyDrawing()
, не забудьте идти сначала толкать оба GL_PROJECTION
а также GL_MODELVIEW
матрица через glPushMatrix
и восстановить их после прорисовки glPopMatrix
, Любое другое состояние, которое вы изменяете, может быть как push, так и pop glPushAttrib
и правильный атрибут. Не забудьте также отсоединить любую текстуру, FBO, PBO и т. Д., Которую вы можете связать внутри doMyDrawing ();