Прозрачность OpenGL ES 2.0 с использованием альфа-тестирования в шейдере - PullRequest
4 голосов
/ 15 мая 2011

Я пытаюсь сделать прозрачный объект в OpenGL ES 2.0.Я настраиваю GL со следующими параметрами:

    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_LESS);
    GLES20.glDisable(GLES20.GL_BLEND);
    GLES20.glClearDepthf(1.0f);

Вот код для шейдеров:

private final String mVertexShader = "uniform mat4 uMVPMatrix;\n" +
        "attribute vec4 aPosition;\n" +
        "attribute vec2 aTextureCoord;\n" +
        "varying vec2 vTextureCoord;\n" +
        "void main() {\n" +
        "  gl_Position = uMVPMatrix * aPosition;\n" +
        "  vTextureCoord = aTextureCoord;\n" +
        "}\n";

private final String mFragmentShader = "precision mediump float;\n" +
        "varying vec2 vTextureCoord;\n" +
        "uniform sampler2D sTexture;\n" +
        "void main() {\n" +
        "  vec4 base = texture2D(sTexture, vTextureCoord);\n" +
        "  if(base.a < 0.5){ discard; }\n" +
        "  gl_FragColor = base;\n" +
        "}\n";

Результирующие изображения рендеринга: http://imgur.com/hNqm0 http://imgur.com/dmS2O. Пожалуйста, скажите мне, что я делаю неправильно, он прекрасно отрисовывается в режиме Rendermonkey OpenGL ES.

Если я использую

    GLES20.glDisable(GLES20.GL_BLEND);

для инициализации OpenGL, я получаю правильную прозрачность, но без упорядочиваниятреугольников.Может быть, какая-то сортировка поможет в этом случае?

Ответы [ 4 ]

5 голосов
/ 15 мая 2011

Альфа-смесь поддерживается OpenGL.Вам не нужен специальный код в шейдере.Попробуйте установить следующее:

        GLES20.glEnable(GLES20.GL_BLEND);
    GLES20.glBlendFunc (GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
4 голосов
/ 29 ноября 2012

ОК, поэтому я нашел причину этого сбоя.

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

Мне пришлось отключить запись в буфер глубины с помощью этого кода:

GLES20.glDepthMask(false);

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

Спасибо за ваши ответы ниже, но мне не нужно использовать альфа-смешивание - мне нужно использовать альфа-тестирование, и оно не требует сортировки треугольников.

2 голосов
/ 21 января 2016

Я думаю, вы должны поставить "gl_FragColor = base;"в «другом», как

private final String mFragmentShader = 
    "precision mediump float;\n" +
    "varying vec2 vTextureCoord;\n" +
    "uniform sampler2D sTexture;\n" +
    "void main() {\n" +
    "  vec4 base = texture2D(sTexture, vTextureCoord);\n" +
    "  if(base.a < 0.1){ discard; }\n" +
    "  else { gl_FragColor = base; }\n" +
    "}\n";

этот

2 голосов
/ 15 мая 2011

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

...