![](/img/trans.png)
[英]iOs OpenGL ES 2.0 blending with shader on device and on simulator
[英]iOs OpenGL ES 2.0 adding textures with low opacity on device and on simulator
我在程序中多次绘制纹理时遇到问题。
混合模式为
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
a通道的值从cpu代码传递到着色器中。
precision highp float;
uniform sampler2D tShape;
uniform vec4 vColor;
uniform float sOpacity;
varying vec4 texCoords;\n"
void main() {
float a = texture2D(tShape, texCoords.xy).x * sOpacity;
gl_FragColor = vec4(vColor.rgb, a);
}
之前是用
O = pow(O, 1.3);
以获得最佳视觉效果。
我在黑色透明画布(0; 0; 0; 0)上以颜色(0; 0; 0)进行绘制,但不透明度非常低:
0.03 -> 0.01048
0.06 -> 0.0258
0.09 -> 0.0437
0.12 -> 0.0635
...
我希望在模拟器上绘制多个图形后,点颜色的最大值将为(0; 0; 0; 1)(黑色,不透明):
但是在设备上不是这样的:
您有什么想法,为什么呢?
更新:
同样,手动混合的工作方式也不正确(与标准设置有所不同)。
glBlendFunc(GL_ONE, GL_ZERO);
片段着色器代码:
#extension GL_EXT_shader_framebuffer_fetch : require
precision highp float;
uniform sampler2D tShape;
uniform vec4 vColor;
uniform float sOpacity;
varying vec4 texCoords;
void main() {
float a = texture2D(tShape, texCoords.xy).x * sOpacity;
gl_FragColor = vec4(vColor.rgb * a, a) + (gl_LastFragData[0] * (1.0 - a));
}
在模拟器上的结果:
在设备上的结果:
我试图了解您的方法,所以写下了一些公式:
这是执行新绘图的方式(如果没有犯任何错误):
color = {pencil_shape}*sourceAlpha + {old_paint}*(1-sourceAlpha)
alpha = {pencil_shape} + {old_paint}*(1-sourceAlpha)
因此,基本上您的alpha在每一帧上都接近于1,并且每次根据* pencil_shape *中的src alpha进行颜色混合。
问题:
经过一些实验,我了解到此问题在于device的支持精度。 因此,在iPad Air上,此问题的出现少于在iPad 4、3上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.