在顶点颜色中使用带有alpha的GL_MODULATE时,GLKit不显示纹理

时间:2015-03-12 22:23:37

标签: ios opengl-es glkit

我有一个纹理图像,我正在使用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?

时,有关纹理消失的原因的任何帮助

添加快照:


Original Texture 这是原始纹理


RGBA (1.0, 1.0, 1.0, 1.0) RGBA(1.0,1.0,1.0,1.0) - 白色,无预复制,不透明,纹理可见


RGBA (1.0, 1.0, 1.0, 0.5) RGBA(1.0,1.0,1.0,0.5) - 白色,无预乘,alpha = 0.5,纹理丢失


RGBA (1.0, 0, 0, 1.0) RGBA(1.0,0,0,1.0) - 红色,无预复制,不透明,纹理可见


RGBA (1.0, 0, 0, 0.5) RGBA(1.0,0,0,0.5) - 红色,无预乘,alpha = 0.5,纹理丢失


RGBA (0.5, 0, 0, 0.5) - after premutiplying a = 0.5 per @andon RGBA(0.5,0,0,0.5) - 红色,预乘,每个@andon alpha = 0.5,纹理可见,但你可能需要放大才能看到它


RGBA (0.1, 0, 0, 0.1) - after premutiplying a = 0.5 per @andon RGBA(0.1,0,0,0.1) - 红色,预乘,alpha = 0.1每个@andon,纹理丢失,可能因为没有足够的对比度


RGBA (0.9, 0, 0, 0.9) - after premutiplying a = 0.5 per @andon RGBA(0.9,0,0,0.9) - 红色,预乘,每个@andon alpha = 0.9,纹理可见,但你可能需要放大才能看到它

1 个答案:

答案 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,则可以使用原始混合函数来完成。

正确的预乘alpha混合(通过预乘顶点颜色):

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