我简化了我的问题来绘制一个正方形来说明。我想绘制一个纹理,它将alpha通道从0减至255,并垂直回0,以便与背景融合。现在它使背景变暗,我找不到原因。这是使用iOS上的OpenGL ES 9.在OpenGL ES中混合不能像我认为的那样工作
首先,我启用我想我要的混合:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
然后我填的是缓冲带绿色:
glClearColor(0, 0.5, 0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
我有这个像我使用的质地:
我画以下的顶点({X,Y,Z},{R,G,B,A},{TX,TY})与GL_TRIANGLES:
{{0.4, 0.3, 0}, {1, 0, 0, 1}, {0, 0}},
{{0.6, 0.3, 0}, {1, 0, 0, 1}, {1, 0}},
{{0.4, 0.5, 0}, {1, 0, 0, 1}, {0, 1}},
{{0.6, 0.3, 0}, {1, 0, 0, 1}, {1, 0}},
{{0.4, 0.5, 0}, {1, 0, 0, 1}, {0, 1}},
{{0.6, 0.5, 0}, {1, 0, 0, 1}, {1, 1}},
我希望顶点的红色成分,以调节质地,因为这是我的片段着色器:
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = DestinationColor * texture2D(Texture, TexCoordOut);
}
这样做,但结果不是简单地在绿色红色。天黑的边缘,在那里我会想到要绘制只是绿色:
的答案类似的问题here说我应该使用glTexEnv(GL_BLEND)。不过,我认为这是一个OpenGL ES 1 API。
任何人都知道我可以如何实现所需的混合?我想让红色在绿色中消失。顶部和底部应该是绿色的,而不是较深的。不应该有明显的水平边缘。
编辑:我添加更多图片说明我的问题。下面是GIMP两个粉红色圆点:
当我在其他(GIMP)的顶部移动一个,他们很好地融为一体。他们还与绿色背景很好地融合:
当我重新创建在OpenGL ES,我得到的颜色变深,这是尤其是粉红色的圆点叠加可见。我做了一个很窄的这个时候,所以你能看到的效果更好:
我都尝试glBlendFunc和glBlendFuncSeparate,这就造成同样的效果。请注意背景alpha是1.
我在混合功能上有些生疏,但是你的截图看起来像结果类似于Photoshop的“繁殖”。我认为你需要一个不同的混合函数,但不能完全回答哪一个... –
应该有一个常用混合函数的“备忘单”,以供参考... –
我到达了这个混合函数,因为它被推荐为“正常”。 GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA应该表示color_blended = color_src * alpha_src + color_destination *(1 - alpha_src)。这就是我困惑的原因。假设alpha是0.1,红色是1,绿色是0.5,那些边缘应该是0.1(1,0,0)+(1-0.1)(0,0.5,0)=(0.1,0.45,0),对?如果您打开一个颜色比较网站并将#1A7300(混合示例)与#008000(背景)进行比较,则不会太暗。 –