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 ответ
Похоже, что тест глубины вызывает ваши проблемы. Что происходит, как вы описываете, сначала выводится точка впереди, а значение глубины заменяется. Затем точка позади растеризуется, но все фрагменты не проходят тест глубины, поэтому больше ничего не визуализируется / смешивается.
Как отметил Andon M. Coleman, вам действительно нужно отсортировать фрагменты по глубине для правильного альфа-смешения (точная прозрачность, независимая от порядка, в настоящее время нецелесообразна для частиц, хотя вы можете попробовать некоторые из приближенных методов. Усреднение всех цветов с использованием альфа-значений как вес тоже может дать приличные результаты).
Особенно для плотности частиц, которую вы имеете, и отсутствия вариаций среди частиц, между сортировкой и не сортировкой, вероятно, не будет большой разницы. В этом случае сначала убедитесь, что вы рисуете все непрозрачные материалы с включенным тестированием глубины, а затем рисуете частицы. Вы хотите, чтобы тестирование глубины было включено, чтобы ваши частицы не прорисовывались, когда они находятся за непрозрачными предметами, однако вы не хотите, чтобы они заслоняли друг друга - вы хотите использовать буфер глубины для тестирования, но не записывать значения глубины. Для этого используйте glDepthMask