我有一个纹理图像,我正在使用GLKit。如果我在纹理上使用GL_MODULATE并且具有顶点RGBA(1.0,1.0,1.0,1.0),那么纹理将完全像在GL_REPLACE中那样显示。完全不透明。 然后,如果我使用红色(1.0,0.0,0.0,1.0)作为顶点RGB,纹理再次显示为红色调制纹理。 到现在为止还挺好。 但是当我改变顶点颜色的透明度并使用RGBA(1.0,0.0,0.0,0.5)时,只能看到浅红色并且纹理不可见,所以颜色完全取代了纹理。 纹理本身没有alpha,它是RGB565纹理 我正在使用GLKit和GLKTextureEnvModeModulate。
self.effect.texture2d0.envMode = GLKTextureEnvModeModulate;
当我指定alpha?
时,有关纹理消失的原因的任何帮助添加快照:
这是原始纹理
RGBA(1.0,1.0,1.0,1.0) - 白色,无预复制,不透明,纹理可见
RGBA(1.0,1.0,1.0,0.5) - 白色,无预乘,alpha = 0.5,纹理丢失
RGBA(1.0,0,0,1.0) - 红色,无预复制,不透明,纹理可见
RGBA(1.0,0,0,0.5) - 红色,无预乘,alpha = 0.5,纹理丢失
RGBA(0.5,0,0,0.5) - 红色,预乘,每个@andon alpha = 0.5,纹理可见,但你可能需要放大才能看到它
RGBA(0.1,0,0,0.1) - 红色,预乘,alpha = 0.1每个@andon,纹理丢失,可能因为没有足够的对比度
RGBA(0.9,0,0,0.9) - 红色,预乘,每个@andon alpha = 0.9,纹理可见,但你可能需要放大才能看到它
答案 0 :(得分:2)
纹理本身没有alpha,它是RGB565纹理
RGB565
隐式具有常量alpha(不透明 - > 1.0 )。 这可能听起来不太重要,但是使用纹理颜色调制顶点颜色可以实现分量乘法,如果alpha不是 1.0 ,则根本不会起作用。
我的混合功能用于预乘 - One,One - Src。
这需要通过A分量预先乘以顶点颜色的RGB分量。 所有颜色必须预先相乘,包括纹素和顶点颜色。
Vtx = (1.0, 0.0, 0.0, 0.5)
Tex = (R, G, B, 1.0)
// Modulate Vertex and Tex
Src = Vtx * Tex = (R, 0, 0, 0.5)
// Pre-multiplied Alpha Blending (done incorrectly)
Blend_RGB = Src * 1 + (1 - Src.a) * Dst
= Src + Dst / 2.0
= (R, 0, 0) + Dst / 2.0
这样做的唯一方法是将目标颜色除以2并为其添加未改变的源颜色。 假设 类似于线性插值(a * c + (1 - c) * b
)。
// Traditional Blending
Blend_RGB = Src * Src.a + (1 - Src.a) * Dst
= (0.5R, 0, 0) + Dst / 2.0
如果将顶点颜色的RGB部分乘以A,则可以使用原始混合函数来完成。
Vtx = (0.5, 0.0, 0.0, 0.5) // Pre-multiply: RGB *= A
Tex = (R, G, B, 1.0)
// Modulate Vertex and Tex
Src = Vtx * Tex = (0.5R, 0, 0, 0.5)
// Pre-multiplied Alpha Blending (done correctly)
Blend_RGB = Src * 1 + (1 - Src.a) * Dst
= (0.5R, 0, 0) + Dst / 2.0