OpenGL Alpha Stack

时间:2009-09-13 14:06:43

标签: opengl

我对OpenGL有些新意。我已经将它用于渲染纹理(2D)和基本的MODELVIEW转换等非常简单的东西,但现在我想修改类似于MODELVIEW堆栈的方式的alpha值。

我基本上有一个glTex类,它在对它应用某些变换后在某个点渲染纹理。 (翻译,旋转,Alpha。)现在,这适用于简单图像这样的简单事物,但是如果我想画一些更复杂的东西说一个简单的网格。我会转换到网格所需的位置,然后随后绘制它的每个部分。这很好,因为我通常在渲染纹理之前和之后调用 glPushMatrix() glPopMatrix()

当我想控制网格的 alhpa 时出现问题。假设我想以0.50 alpha渲染它。我可以浏览每个组件并更改其alpha值,但这意味着如果网格的某些部分由较小的部分组成,则它们必须执行相同的操作,或者如果它们自己的较小部分具有alpha值,我会必须计算一个全新的alpha,这将变成一个非常漫长的过程。

我是否有某种方法可以获得像MODELVIEW一样的alpha堆栈?还是有更好的方法去做吗?

示例 - 网格呈现为0.5 alpha。如果它的组件通常以0.25 alpha的形式呈现,则现在将呈现为.125 alpha

顺便说一句,我将glBlendFunc设置为GL _SRC _ALPHA和GL _ONE _MINUS _SRC _ALPHA。

2 个答案:

答案 0 :(得分:3)

没有办法将一些额外的alpha乘以当前的alpha,就像你可以修改OpenGL中的转换矩阵一样,因为OpenGL没有“alpha”状态。 alpha值与颜色信息一起传递。所以你想要做的是编写一个小助手类来跟踪你的alpha状态:

在这里输入代码

#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函数在推送后使用当前alpha设置颜色。

答案 1 :(得分:0)