Проблемы с прозрачностью Android opengl - PullRequest
2 голосов
/ 17 февраля 2011

Я рендерил 3 разных полигона с одинаковой текстурой смайлика. Текстура представляет собой желтый круг, нанесенный на прозрачный фон.

Моя проблема в том, что если я поставлю смайлик, который нарисован раньше, перед другим, который будет нарисован позже, он сделает прозрачным нарисованный позже, а фон ранних - прозрачным.

Ну, картинка стоит тысячи слов! См. Изображение проблемы и смайлик png здесь .

Проблема не возникает, если я помещаю последний нарисованный смайлик перед другим, поэтому проблема, похоже, связана с порядком рисования. У кого-нибудь есть вход?

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

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();
}

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Даже прозрачные фрагменты записываются в буфер глубины. Ваши варианты:

  1. Отключите буфер глубины - либо не пишите в него, либо отключите тест глубины.
  2. Включите альфа-тест, чтобы прозрачные фрагменты были отклонены. e.g.:

    GLES10.glEnable (GLES10.GL_ALPHA_TEST);

    GLES10.glAlphaFunc (GLES10.GL_GREATER, 0);

  3. Сортировка вашей геометрии и рисование четырехугольников в обратном порядке

1 голос
/ 17 февраля 2011

Отключить проверку глубины.Недостающие пиксели самого последнего смайлика отсутствуют, потому что самый главный смайлик заполнил буфер глубины.

Очевидно, вам нужно будет нарисовать ваши смайлики в правильном порядке, сначала сначала.

Я думаю, чтовы бы в идеале хотели бы, чтобы ваш буфер глубины накапливал альфа-значения, а не значения Z ... не знаю, насколько это возможно.: - (

...