淡出带有颜色但没有纹理的 OpenGL VBO

Fade Out OpenGL VBO with Colors but without Texture

我想在 OpenGL ES 中淡出一个 VBO 对象。 VBO 是使用 RGBA 格式 GL_UNSIGNED_BYTE 绘制的,如下所示:

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer( 4, GL_UNSIGNED_BYTE, ....

我相当确定我应该像这样设置混合:

glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glColor4f( 1, 1, 1, alpha ); // I will be changing alpha from 1 to 0

但它不会褪色,这是有道理的,因为我认为 src alpha 来自我的固定 VBO。

所以我想也许我应该只将 3 个字节传递给驱动程序以保持我的 VBO 颜色,然后 alpha 将来自 glColor4f 命令。

 glColorPointer( 3, GL_UNSIGNED_BYTE, ....

但是由于不明原因(iPad 开发 Xcode)导致崩溃,我仍在尝试破译。我认为我所有的 glColorPointer 偏移量仍然可以 - 我在 MyVertexObject 中仍然有所有 4 个字节(RGBA)所以我不认为这是一个填充问题 - 我没有更改 glColorPointer 命令中的任何偏移值,只是改变了4 比 3。

如果我禁用 GL_COLOR_ARRAY 淡入淡出效果很好,但现在我失去了颜色,它使用的是我上面设置的白色。

所以我被困住了,因为我似乎无法从 RGB 颜色中单独控制 Alpha 通道。还有另一种方法可以用颜色淡化 VBO 吗?谢谢

您可以通过使用 GL_CONSTANT_ALPHA 作为混合函数来独立于 VBO 中的颜色指定混合因子:

glBlendColor(0.0f, 0.0f, 0.0f, alpha);
glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);

这将为混合函数使用 glBlendColor() 中指定的 alpha 分量。