Правильный способ сохранить / восстановить состояние OpenGL ES - PullRequest
2 голосов
/ 19 августа 2010

Я знаю, что для сохранения / восстановления состояния матрицы вы используете стандартные операции push / pop.Мне не удалось найти подходящее соглашение для сохранения / восстановления состояния, например, при использовании glLineWidth () или glColor4ub ().

Кажется, в этом нет необходимости, если вы устанавливаете ширину линии или цветПравильно, если вы хотите что-то нарисовать, но я могу видеть пример того, где вы находитесь в своей собственной функции рисования, вызовите какую-то отдельную функцию рисования, которая изменяет ширину линии на вас без вашего ведома, а затем, когда вы продолжаете рисовать, она приходитне так, как ожидалось.

Чтобы исправить это, вы можете сбросить ширину линии после вызова любой функции, которую вы не знаете, что она делает, но которая кажется не элегантной, и я чувствую, что уже должно быть решениеэто, но я как-то пропустил это.

Для своего собственного кода я делал это в начале каждой функции рисования:

GLfloat savedLineWidth = 1.0f;
glGetFloatv(GL_LINE_WIDTH, &savedLineWidth);
glLineWidth(lineWidth);

И затем восстанавливал состояние вконец функции рисования примерно так:

glLineWidth(savedLineWidth);

Это действительно не поможет мне, если только я не предположу, что каждыйФункция рисования, о которой я не знаю, хороша и восстанавливает состояние самостоятельно.

Должен ли я сделать это предположение?Или я что-то упустил?

1 Ответ

2 голосов
/ 19 августа 2010

Если бы это был обычный OpenGL (не вариант ES), то вы могли бы выдвинуть атрибут как:

glPushAttrib(GL_LINE_WIDTH);
glLineWidth(2.0f);
... etc ...
glPopAttrib();

Увы, в OpenGL ES это недоступно.Ваш подход к получению и настройке примерно такой же, как вы получите.

Просто попробуйте уменьшить количество раз, когда вы получаете, поскольку это очень трудоемкий процесс.В отличие от отправки, получение не буферизируется.

Возможно, ваш подход должен просто не волноваться.Всякий раз, когда вы хотите установить ширину линии, просто установите ее.Ширина линии не должна сильно влиять.

Жесткий вызов.Зависит от того, что эти другие функции рисования.У тебя есть код?Может быть, вы могли бы посмотреть?

...