android - 使用opengles拥有透明背景

标签 android opengl-es

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

这是我的渲染器:

@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);

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

最佳答案

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

但是,对于图像:

1) 您的图像需要内置 alpha channel 。 RGB 不会削减它 - 你需要 RGBA。这可以很容易地在 Photoshop、Gimp 或其他图像编辑器中修复。

2) 如果您想要半透明,最好将 alpha channel 设置为某个中间值,并将 RGB 设置为您希望成为“半透明”混合色的任何颜色。或者,您可以在 fragment 着色器中创建自定义混合函数,以对 alpha channel 执行一些特殊操作。

关于android - 使用opengles拥有透明背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13129592/

相关文章:

可绘制资源的Android动态变量

java - Android OpenGL ES 以纵横比全屏显示图像

android - 如何解决 'None of the following candidates is applicable because of receiver type mismatch' for compose 中的 material icons

android - getPreferenceScreen()

java - 是否可以以编程方式将文件从 Android 智能手机发送到计算机/PC?

java - Android - 服务未启动

android - 如何以编程方式将单词添加到任何 Android 键盘预测词典中?

android - GLUtils.texImage2D 和纹理中的 Alpha 问题

java - 在 Android 中显示类似字幕的滚动文本

java - 在 2 个 Activity 中重用 GLsurfaceView