Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用顶点颜色中的alpha进行GL_调制时,GLKit不显示纹理_Ios_Opengl Es_Glkit - Fatal编程技术网

Ios 使用顶点颜色中的alpha进行GL_调制时,GLKit不显示纹理

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

我有一个纹理图像,我正在使用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)-红色,预倍增,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