Ios 使用顶点颜色中的alpha进行GL_调制时,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)时,只会看到浅红色,纹理不可见,因此颜色会完全替换纹理。Ios 使用顶点颜色中的alpha进行GL_调制时,GLKit不显示纹理,ios,opengl-es,glkit,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,它是RGB
纹理本身没有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)-红色,预倍增,alpha=0.5 per@andon,纹理可见,但您可能需要放大才能看到它
RGBA(0.1,0,0,0.1)-红色,预倍增,alpha=0.1 per@andon,纹理丢失,可能是因为没有足够的对比度
RGBA(0.9,0,0,0.9)-红色,预倍增,alpha=0.9 per@andon,纹理可见,但您可能需要放大才能看到它
纹理本身没有alpha,它是RGB565纹理
RGB565
隐式具有常量alpha(不透明->1.0)。这听起来可能不重要,但使用纹理颜色调制顶点颜色会进行组件级乘法,如果alpha不是1.0,则根本不起作用
我的混合函数是用于预乘-One,One-Src的
这需要将顶点颜色的RGB分量预乘以A分量所有颜色必须预先相乘,这包括纹理和顶点颜色
您可以在下面看到原因:
这样做的唯一一件事是将目标颜色除以2,然后将未更改的源颜色添加到目标颜色中。假设它类似于线性插值(a*c+(1-c)*b
)
适当的混合应如下所示:
如果将顶点颜色的RGB部分乘以A,则可以使用原始混合函数完成此操作
正确的预乘alpha混合(通过预乘顶点颜色):
纹理本身没有alpha。因此,在加载时,它会生成565 RGB图像。我猜这意味着α是1,并且是预乘的。我的混合函数是用于预乘-One,One-Src的。我正在试验565本身是否存在问题,如果缺少纹理alpha,GLKit着色器不知何故无法工作。因此,我的下一个计划是生成一个包含alpha的纹理,即使它是1,也要看看GLKit的工作方式是否有任何不同。正如我所说,当使用565(或任何RGB格式)时,alpha已经是一个常数1.0。这只是GL自动为您执行的操作之一,顶点属性或颜色的第四个组件如果未显式存储,将被指定为1.0。给定混合函数,您应该相应地调整顶点颜色,这意味着将其RGB乘以A。这非常有用,并且解释得非常好。谢谢我完全错过了顶点颜色的预乘。然而,我仍然不确定为什么纹理会消失。在我的例子中,我的纹理是浅灰色背景上的深灰色阴影线。既然解释了它是如何工作的,我还应该看到阴影线的红色部分吗?在红色背景上有一些红色阴影线?我可能没有很好地考虑这个问题,所以我也要尝试对顶点颜色进行预乘,看看是否能得到阴影线。好的,我想这是你说的。我尝试使用高透明度,即低阿尔法。当我这么做的时候,它也会降低红色值,所以阴影线和背景之间的差别可以忽略不计。所以他们消失了。我尝试了R和A之间的多个值,有些地方出现了阴影线。所以也许我需要从图像中较暗的阴影线开始,这样才能工作。但你的解释很正确。谢谢你的答案(和数学)非常清晰。我认为我的纹理太微妙了,在调制过程中顶点颜色压倒了微小的差异,所以顶点颜色是调制后剩下的所有颜色。我想这是一种倍增效应。@nishant:如果你能附上一个截图,我可以在早上看一看。我可能需要补充一些额外的细节。如果这是用于合成多个层,则需要讨论混合方程的alpha部分(您会注意到列出的混合方程仅适用于RGB-我这样做是为了简单)。好的,我也会尝试!谢谢你在这方面的帮助。非常感谢。你教我如何从数学角度思考tex env+混合,这将使解决问题变得更容易。
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
// Traditional Blending
Blend_RGB = Src * Src.a + (1 - Src.a) * Dst
= (0.5R, 0, 0) + Dst / 2.0
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