首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android opengl透明度问题

Android opengl透明度问题
EN

Stack Overflow用户
提问于 2011-02-17 20:18:44
回答 2查看 3.7K关注 0票数 2

我用相同的笑脸纹理渲染了3个不同的多边形。纹理是放置在透明背景上的黄色圆圈。

我的问题是,如果我将之前绘制的笑脸放在稍后绘制的笑脸之前,它会使后来绘制的笑脸变得透明,而早期的背景是透明的。

一张图片胜过千言万语!查看问题的图像和笑脸png here

如果我把最后绘制的笑脸放在另一个前面,问题就不会发生,所以问题似乎与绘制顺序有关。有人有什么建议吗?

代码语言:javascript
复制
public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
    //Textures a loaded here See next section for the implementation of loadTextures method on the polygon class.
    loadTextures(gl, context);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearColor(.5f, .5f, .5f, 1);
    gl.glEnable(GL10.GL_DEPTH_TEST);

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
    if(h == 0) {
        h = 1;
    }

    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    float ratio = (float) w / h;
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 30);
    GLU.gluLookAt(gl, lookEyeX, lookEyeY, lookEyeZ, lookCenterX, lookCenterY, lookCenterZ, lookUpX, lookUpY, lookUpZ);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}

public void onDrawFrame(GL10 gl) {      
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

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

    draw(gl);
}

loadTexture方法的实现

代码语言:javascript
复制
public void loadTextures(GL10 gl, Context context) {
    if(bitmap == 0) {
        return;
    }
    //Get the texture from the Android resource directory
    InputStream is = context.getResources().openRawResource(bitmap);
    Bitmap bitmap = null;
    try {
        //BitmapFactory is an Android graphics utility for images
        bitmap = BitmapFactory.decodeStream(is);

    } finally {
        //Always clear and close
        try {
            is.close();
            is = null;
        } catch (IOException e) {
        }
    }

    //Generate one texture pointer...
    gl.glGenTextures(1, textureIDs, 0);
    //...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]);

    //Create Nearest Filtered Texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

    //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    //Clean up
    bitmap.recycle();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-17 20:52:02

即使是透明的片段也会被写入深度缓冲区。您可以选择:

  1. 禁用深度缓冲区-要么不写入它,要么禁用深度测试。
  2. 启用alpha测试,以便拒绝透明片段。例如:

GLES10.glEnable( GLES10.GL_ALPHA_TEST );

GLES10.glAlphaFunc( GLES10.GL_GREATER,0);

  • 对几何进行排序并以从后到前的顺序绘制四边形
票数 2
EN

Stack Overflow用户

发布于 2011-02-17 20:43:24

关闭深度测试。最后一个笑脸的像素丢失,因为最前面的笑脸已经填满了深度缓冲区。

显然,你需要按照正确的顺序画你的笑脸,最后面的第一个。

我猜你理想情况下想要的是让你的深度缓冲区累积alpha值而不是Z值……不知道这有多大可能。:-(

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5028829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档