Смешивание прозрачных текстур с глубиной

Я пытаюсь смешать текстуры с прозрачными областями:

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, ...);
glVertexPointer( 2, GL_FLOAT, 0, ... );
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );

Если я не добавлю glDisable(GL_DEPTH_TEST), прозрачные части верхних текстур перезапишут все, что под ними (вместо смешивания). Есть ли способ сделать это, не отключая глубину? Я пробовал различные функции смешивания, но ни одна из них не помогла.


person l.thee.a    schedule 22.05.2010    source источник


Ответы (1)


Включение проверки глубины на самом деле не сортирует вашу геометрию по глубине — в обычном случае GL_LESS она просто предотвращает отрисовку примитивов, если они не ближе к зрителю, чем то, что было нарисовано ранее. Это позволяет вам рисовать непрозрачную геометрию в любом порядке и при этом получать желаемый результат, но для правильного рендеринга смешанной геометрии обычно требуется, чтобы все, что находится за смешанным объектом, уже было визуализировано.

Вот что вы должны сделать, чтобы смесь непрозрачной и смешанной геометрии выглядела правильно:

  1. Отделите смешанную геометрию от непрозрачной.
  2. Отсортируйте смешанную геометрию сзади наперед.
  3. Сначала нарисуйте всю непрозрачную геометрию, как обычно.
  4. Нарисуйте смешанную геометрию в отсортированном порядке. Вы можете оставить тестирование глубины включенным, но временно отключить запись глубины с помощью glDepthMask(GL_FALSE).

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

person Pivot    schedule 23.05.2010