我正在使用自定义着色器在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;
}
理想的输出颜色看起来像这样......
但它看起来像这样......
明天我要再调查一下。我希望我知道为什么输出完全不同于其他地方所说的应该是。
答案 0 :(得分:0)
好的,感谢@ Reaper的评论我开始全面调查这个问题。
在我们的着色器中混合硬编码颜色时,颜色实际上是正确的。
所以它引导我看看我们正在使用的纹理图像。
具有50%alpha的白色的那个肯定是白色的。 (不是灰色的)。
但......(系统中的怪癖?)open GL将其提升为50%灰色,50%alpha。
所以混合物实际上并没有真正混合正确的颜色。
我们通过使用100%alpha图像作为颜色和100%图像作为alpha贴图(黑色 - >白色)来修复此问题。
通过这样做,它解决了我们遇到的问题。