【问题标题】:OpenGL Alpha StackOpenGL Alpha 堆栈
【发布时间】:2012-03-06 17:02:16
【问题描述】:

我对 OpenGL 有点陌生。我已经将它用于非常简单的东西,例如渲染 Textures(2D) 和基本的 MODELVIEW 转换,但现在我想以类似于 MODELVIEW 堆栈的方式修改 alpha 值。

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

当我想控制网格的alhpa时,问题就出现了。假设我想以 0.50 alpha 渲染它。我可以遍历它的每个组件并更改它们的 alpha 值,但这意味着如果网格的某些部分由较小的部分组成,它们将不得不做同样的事情,或者如果它们本身的较小部分具有 alpha 值我会必须计算一个全新的 alpha,这会变成一个非常漫长的过程。

有什么方法可以得到一个像 MODELVIEW 那样的 alpha 堆栈吗?或者有什么更好的办法吗?

示例 - 网格以 0.5 alpha 呈现。如果它有一个通常以 0.25 alpha 呈现的组件,那么它现在将以 0.125 alpha 呈现

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

【问题讨论】:

    标签: opengl


    【解决方案1】:

    没有办法像修改 OpenGL 中的变换矩阵那样将一些额外的 alpha 乘以当前 alpha,因为 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 设置颜色。

    【讨论】:

    • 不完全是我想要的,但我想尽可能接近。谢谢:)
    • 我知道,但是除了自己编码之外别无他法。
    【解决方案2】:

    【讨论】:

    • 这可以让你保存 alpha 值,但它不能让你乘 alpha 值。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2011-12-14
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多