我对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。
答案 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)
尝试glPushAttrib
和glPopAttrib
http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html