glPoint Alpha Blending проблема

У меня проблемы с альфа-смешиванием glPoints. Альфа-смешивание работает правильно, когда glPoint находится над фоном, но когда glPoint перекрывает другой glPoint, цвет фона будет виден, а не базовый glPoint.

// create texture

    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

    // Draw

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, tex);
    ....
    glDrawArrays(GL_POINTS, 0, numberOfPoints);

    // Frag Shader

    uniform sampler2D Texture; 

    void main(void) 
    {
        gl_FragColor = texture2D(Texture, gl_PointCoord); 
    }

Что я делаю неправильно?

1 ответ

Похоже, что тест глубины вызывает ваши проблемы. Что происходит, как вы описываете, сначала выводится точка впереди, а значение глубины заменяется. Затем точка позади растеризуется, но все фрагменты не проходят тест глубины, поэтому больше ничего не визуализируется / смешивается.

  1. Как отметил Andon M. Coleman, вам действительно нужно отсортировать фрагменты по глубине для правильного альфа-смешения (точная прозрачность, независимая от порядка, в настоящее время нецелесообразна для частиц, хотя вы можете попробовать некоторые из приближенных методов. Усреднение всех цветов с использованием альфа-значений как вес тоже может дать приличные результаты).

  2. Особенно для плотности частиц, которую вы имеете, и отсутствия вариаций среди частиц, между сортировкой и не сортировкой, вероятно, не будет большой разницы. В этом случае сначала убедитесь, что вы рисуете все непрозрачные материалы с включенным тестированием глубины, а затем рисуете частицы. Вы хотите, чтобы тестирование глубины было включено, чтобы ваши частицы не прорисовывались, когда они находятся за непрозрачными предметами, однако вы не хотите, чтобы они заслоняли друг друга - вы хотите использовать буфер глубины для тестирования, но не записывать значения глубины. Для этого используйте glDepthMask

Другие вопросы по тегам