OpenGL Z-сортировка прозрачности - PullRequest
1 голос
/ 13 мая 2011

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

Я вызываю их в начале каждого вызова рендеринга.

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Ответы [ 3 ]

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

Разобрался. Вы можете отказаться от фрагмента шейдера

mediump vec4 basecolor = texture2D(sTexture, TexCoord);

if (basecolor.a == 0.0){
    discard;
}

gl_FragColor = basecolor;
5 голосов
/ 13 мая 2011

Ваш заголовок, по сути, является ответом на ваш вопрос!

Обычно прозрачность выполняется путем сначала рендеринга всех непрозрачных объектов в сцене (позволяя z-буферу выяснить, что видно), а затем рендеринга всех прозрачных объектов иззадом наперед.

4 голосов
/ 13 мая 2011

Дрю Холл дал вам хороший ответ, но другой вариант - установить glEnable(GL_ALPHA_TEST) с glAlphaFunc(GL_GREATER, 0.1f).Это предотвратит рендеринг прозрачных пикселей (в данном случае с альфа <0.1f).Таким образом, они не записывают в Z-буфер, и другие вещи могут «просвечивать».Однако это работает только на полностью прозрачных объектах.У него также есть неровные края везде, где находится альфа-кромка 0,1, и это может выглядеть плохо для отдаленных объектов, где пиксели большие по сравнению с объектом. </p>

...