有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android在OpenGLES中通过glBlendFunc混合获得正确的不透明度/颜色

在我的程序中,我想在有纹理的背景上画一个正方形(不透明度不同,比如说红色)。但是,根据背景的不同,正方形的颜色会出现错误。当alpha=1.0f(不透明)时,正方形应显示为红色,在黑色背景上显示为红色,但在白色背景上显示为白色(并在两者之间相应缩放)

在my 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) 个答案

  1. # 1 楼答案

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

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

    在画正方形之前,我需要称之为:

       gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);  
    
  2. # 2 楼答案

    我的答案可能会有所变化,但有一件事我可以肯定的是,你应该使用以下混合函数

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