OpenGL Alpha Stack - PullRequest
       5

OpenGL Alpha Stack

0 голосов
/ 13 сентября 2009

Я немного новичок в OpenGL. Я использовал его для очень простых вещей, таких как рендеринг текстур (2D) и базовых преобразований MODELVIEW, но теперь я хочу модифицировать альфа-значения в моде, аналогично стеку MODELVIEW.

У меня в основном класс glTex, который визуализирует текстуру в определенный момент после применения к ней определенных преобразований. (Перевод, Вращение, Альфа.) Теперь, это хорошо работает для простых вещей, таких как простые изображения, но если я хочу нарисовать что-то более сложное, скажем, простая сетка. Я хотел бы перевести в нужное положение сетки, а затем впоследствии нарисовать каждую ее часть. Это работает нормально, потому что я обычно вызываю glPushMatrix () и glPopMatrix () до и после рендеринга текстуры.

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

Есть ли какой-нибудь способ получить альфа-стек, подобный стеку MODELVIEW? Или есть ли лучший способ сделать это?

Пример. Сетка отображается при 0,5 альфа. Если в нем есть компонент, который обычно отображается с коэффициентом альфа 0,25, теперь он будет отображаться с коэффициентом альфа-125

.

Кстати, у меня для glBlendFunc установлено значение GL _SRC _ALPHA и GL _ONE _MINUS _SRC _ALPHA.

Ответы [ 2 ]

3 голосов
/ 14 сентября 2009

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

введите код здесь

#define ALPHA_STACK_SIZE 10

class CAlphaState {
private:
   float m_alphaStack [ALPHA_STACK_SIZE];
   int m_tos;
public:
   CAlphaState () : m_tos (-1) { }
   inline float Push (float alpha) {
      if (m_tos >= 0)
         alpha *= m_alphaStack [m_tos];
      if (m_tos < ALPHA_STACK_SIZE - 1) // TODO: Add dynamic stack size handling
         m_alphaStack [++m_tos] = alpha;
      return alpha;
      }
   inline void Pop (void) { if (m_tos >= 0) m_tos--; }
   inline void Get (void) { return (m_tos < 0) ? 1.0f : m_alphaStack [m_tos]; }
   inline void Set (float alpha) { glColor4f (1.0f, 1.0f, 1.0f, Push (alpha)); }
   };

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

0 голосов
/ 13 сентября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...