Android在OpenGL-ES中使用glBlendFunc混合获得正确的不透明度/颜色

时间:2011-02-01 00:31:02

标签: java android opengl-es

在我的程序中,我想在纹理背景上绘制一个正方形(具有不同的不透明度,让红色为参数)。但是,根据背景,正方形显示错误的颜色。对于alpha = 1.0f(不透明),正方形应该显示为红色,它在黑色背景上显示,但在白色背景上,它显示为白色(并相应地在其间缩放)

在我的GLActivity中设置了以下标志:

gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_BUFFER_BIT);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_DITHER);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);

然后我绘制背景纹理:

gl.glClearColor(0.0f,0.0f,0.0f,1.0f);


gl.glBindTexture(GL10.GL_TEXTURE_2D, texturesFPS[1]);
 gl.glEnable(GL10.GL_TEXTURE_2D);

 gl.glPushMatrix();
 gl.glTranslatef(imageOffSetX, 0, 0);
 gl.glColor4f(1,1,1,1);
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

 gl.glVertexPointer(3, GL10.GL_FLOAT, 0,vertexBGBuffer);
 gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBGBuffer);
 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);

 gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 gl.glDisable(GL10.GL_TEXTURE_2D);

然后我在我的背景图像上绘制一个正方形:

 gl.glPushMatrix();
 gl.glTranslatef(x, y, 0);
 gl.glColor4f(color[0], color[1], color[2], 1.0f); // Set to 1.0f temporarily
 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
 gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer);
 gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 gl.glPopMatrix();

我在glBlendFunc中尝试了不同的值,但无法理解如何实现我想要的。非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:3)

我的回答可能会有所改进,但我肯定知道的一件事是你应该使用以下混合功能......

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

答案 1 :(得分:2)

我刚刚找到解决方案,为了正确绘制背景纹理我需要这个:

   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE);  

然后在画广场之前我需要称之为:

   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);