ios - 改变 alpha 会改变颜色

标签 ios objective-c opengl-es alphablending

我在 OpenGL ES 中渲染元素,它们具有相同的颜色,但 alpha 不同。问题是当 alpha 为 .1 时,颜色会发生变化,而不仅仅是不透明度。例如,当 alpha 分量的值设置为 0.1 时,颜色将从黑色变为紫色。当 alpha 值不是 .1 或其他一些十分之一值时,它工作正常。

我在绘制之前设置混合:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

绘图:

// if the element has any data, then draw it
if(vertexBuffer){
    glVertexPointer(2, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Position[0]);
    glColorPointer(4, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Color[0]);
    glTexCoordPointer(2, GL_FLOAT, sizeof(struct Vertex), &vertexBuffer[0].Texture[0]);
    glDrawArrays(GL_TRIANGLES, 0, [element numberOfSteps] * [element numberOfVerticesPerStep]);
}

最佳答案

这是预乘 alpha 的正常行为(您的混合函数暗示)。使用预乘 alpha 时,必须同时更改颜色和 alpha。

因此,无论何时更改 alpha 的值,新颜色都应等于 originalColor * alpha。请注意,您应该使用 alpha 的浮点归一化值(例如 0.0 - 1.0)而不是定点值(例如 0 - 255)

考虑您选择的混合函数:

目标RGB = (源RGB * 1.0) + (目标RGB * (1.0 - 源A ));

传统的 alpha 混合是:

目标RGB =(源RGB * 源A)+(目标RGB *(1.0 - 源A));

请注意更传统的混合方程如何执行 SrcRGB * SrcA?只有当 RGB 分量确实与 alpha 分量预乘时,您的特定混合方程才能正常工作。

关于ios - 改变 alpha 会改变颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19984139/

相关文章:

ios - 如何等待动画——完成 block

objective-c - 将 .plist 文件与 iCloud 同步

android - 在 PC 上测试 opengles 程序

android - 在 Xaml 中将图像添加到按钮的背景

ios - sgxTextureGetImageRowBytes EXC_BAD_ACCESS

iphone - Cocos2D标签不可见,黑屏

objective-c - Xcode 4、iOS SDK 4.3 和带有 Greystripe 广告解决方案的 undefined symbol

android - 在 arcore 中的 3d 对象上使用模板蒙版时出现问题

android - 我的应用程序已成功安装到 Android 上,但加载后立即崩溃

ios - UICollectionView 未正确更新 - 使用 THStringyFlowLayout