Смешивание прозрачных текстур с глубиной - PullRequest
5 голосов
/ 22 мая 2010

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

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), прозрачные части верхних текстур перезаписывают все под ними (вместо смешивания). Есть ли способ сделать это без отключения глубины? Я пробовал различные функции смешивания, но ни одна из них не помогла.

1 Ответ

7 голосов
/ 23 мая 2010

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

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

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

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

...