我在 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/