SpriteKit:带有自定义着色器的SKShader没有正确执行`mix`

时间:2018-04-04 17:52:35

标签: ios sprite-kit opengl-es-2.0

我正在使用自定义着色器在SpriteKit中创建一个精灵。

着色器的主要部分就是这样......

vec4 col = mix(baseColor, overlayColor, overlayColor.a);

我拥有的颜色就像......

baseColor = UIColor(red:0.51, green:0.71, blue:0.88, alpha:1.0)

和...

overlay = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5)

根据互联网上的任何地方(链接到以下链接),我在上面使用的混合功能与Photoshop,Pixelmator,Sketch等中的Normal混合模式相同...这应该导致颜色...

col = UIColor(red:0.75, green:0.85, blue:0.95, alpha:1.00)

这是一种明亮的蓝色。但是,我得到的是......

col = UIColor(red:0.51, green:0.61, blue:0.69, alpha:1.00)

这是一种阴暗的灰色。

你可以在这里看到它应该是什么样的...... https://thebookofshaders.com/glossary/?search=mix

如果输入代码......

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform float u_time;

vec4 colorA = vec4(0.5, 0.7, 0.9, 1.0);
vec4 colorB = vec4(1.0, 1.0, 1.0, 0.5);

void main() {
    vec4 color = vec4(0.0);

    // Mix uses pct (a value from 0-1) to
    // mix the two colors
    color = mix(colorA, colorB, colorB.a);
    color.a = 1.0;

    gl_FragColor = color;
}

理想的输出颜色看起来像这样......

enter image description here

但它看起来像这样......

enter image description here

明天我要再调查一下。我希望我知道为什么输出完全不同于其他地方所说的应该是。

1 个答案:

答案 0 :(得分:0)

好的,感谢@ Reaper的评论我开始全面调查这个问题。

在我们的着色器中混合硬编码颜色时,颜色实际上是正确的。

所以它引导我看看我们正在使用的纹理图像。

具有50%alpha的白色的那个肯定是白色的。 (不是灰色的)。

但......(系统中的怪癖?)open GL将其提升为50%灰色,50%alpha。

所以混合物实际上并没有真正混合正确的颜色。

我们通过使用100%alpha图像作为颜色和100%图像作为alpha贴图(黑色 - >白色)来修复此问题。

通过这样做,它解决了我们遇到的问题。