2012-10-29 120 views
3

我正在开发一个使用Android的Opengl-es视频游戏。我使用的图像背景有问题,因为它会绘制背景的颜色。使用opengles具有透明背景

这里我的渲染器:

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

    //Initialize GL:     
    gl.glDisable(GL10.GL_DITHER); 
    gl.glEnable(GL10.GL_TEXTURE_2D);   //Enable Texture Mapping (NEW) 
    gl.glShadeModel(GL10.GL_SMOOTH);   //Enable Smooth Shading 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //Black Background 
    gl.glClearDepthf(1.0f);      //Depth Buffer Setup 
    gl.glEnable(GL10.GL_DEPTH_TEST);   //Enables Depth Testing 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glDepthFunc(GL10.GL_LEQUAL);    //The Type Of Depth Testing To Do 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); //Really Nice Perspective Calculations //<---- SI LAG, probar GL_FASTEST 

    LoadTextures(gl); 
} 

这里抽奖方法:

@Override 
public void onDrawFrame(GL10 gl) { 

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glLoadIdentity(); 

    for(Entity e : entities) 
    { 
     if(e.IsActive()) 
     { 
      gl.glPushMatrix(); 
       e.Draw(gl); 
      gl.glPopMatrix(); 
     } 
    } 

    gl.glDisable(GL10.GL_BLEND);   
    isDrawing = false; 
} 

而且每个实体的绘制方法:

gl.glColor4f(red, green, blue, alpha); 

    // bind the previously generated texture 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

    // Point to our vertex buffer 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, screenBuffer); //2 dimensiones 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    // Draw the vertices as triangle strip 
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4); //12 /3 -> 12 es el tamano del vector de vertices del cuadrado 

    //Disable the client state before leaving 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

我也有这个在我的GLSurfaceView:

setEGLConfigChooser(8,8,8,8,16,0); 
    renderer = new GRenderer(c); 
    setRenderer(renderer);   
    setRenderMode(RENDERMODE_WHEN_DIRTY); 
    getHolder().setFormat(PixelFormat.TRANSLUCENT); 
    setZOrderOnTop(true); 

但它不起作用。我应该使用哪种颜色来实现半透明背景?代码中的任何错误?谢谢

回答

2

为了实现alpha,你的代码在OpenGL调用方面似乎没问题。

然而,对于图像:

1)你的图像需要有烘焙成它们的α信道。 RGB不会削减它 - 你需要RGBA。这可以很容易地修复像Photoshop,Gimp或其他图像编辑器。 2)如果你想要半透明,你可能会更好地将alpha通道设置为某个中间值,并将你的RGB设置为任何你想成为“半透明”混色的颜色。或者你可以在你的片段着色器中创建一个自定义的混合函数,以对alpha通道做一些特殊的处理。