繁体   English   中英

iOs OpenGL ES 2.0在设备和模拟器上添加具有低不透明度的纹理

[英]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进行颜色混合。

问题:

  • 您是否打算在输出图像中使用Alpha?
  • 您的* pencil_shape *是否全黑(0、0、0、0)? (除了我认为它具有抗锯齿效果的角膜)

经过一些实验,我了解到此问题在于device的支持精度。 因此,在iPad Air上,此问题的出现少于在iPad 4、3上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM