Проблема смешивания OpenGL с прозрачным скайбоксом + прозрачная карта высот

Вот моя проблема.

Я визуализирую ортогональный четырехугольник (заполняю область просмотра) перед всем (с раскрашиванием вершин в каждом углу), сразу после того, как я визуализирую кубический скайбокс с 6 прозрачными полигонами (GL_BLEND, исходный GL_ONE, конечный GL_ONE). Это работает отлично, скайбокс наполовину окрашен нижним квадроциклом, а наполовину - его собственными UV-текстурами.

Проблема возникает, когда я добавляю карту высот (GL_BLEND, GL_ONE, ...). Карта высот смешивается со скайбоксом под + с квадроциклом.

Я хочу, чтобы карта высот была смешана с ортоквадом, но не со скайбоксом. Я не хочу видеть скайбокс через карту высот.

Я уверен, что есть другой способ сделать это.

Можно ли сначала визуализировать орто-квадрат и скайбокс (как сейчас), а ЗАТЕМ карту высот со специальным смешиванием, которое вычитает скайбокс, но не орто-квадрат с каким-то многопроходным смешиванием?

Большое тебе спасибо !

Дмитрий


person dimcaron144    schedule 26.02.2011    source источник


Ответы (2)


Ваше glBlendFunc с GL_ONE, GL_ONE называется аддитивным смешиванием и имеет хорошее свойство (как и любое сложение) быть коммутативным, то есть A + B = B + A.

Затем вы можете нарисовать свои вещи в другом порядке, и ваше смешивание даст тот же результат.

В вашем случае вы можете нарисовать свою карту высот и свой скайбокс, без blending ; затем ваш полноэкранный четырехугольник с смешиванием.

Чтобы карта высот и скайбокс не перекрывались, вы можете:

  • сначала нарисуй свой скайбокс, а потом карту высот
  • рисуйте наоборот, с включенным GL_DEPTH_TEST, чтобы буфер Z сортировал видимость пикселей для вас

Надеюсь это поможет

person rotoglup    schedule 26.02.2011

OpenGL не является графом сцены, поэтому после каждого шага рендеринга все дальнейшие команды выполняются над всем существующим содержимым. glBlendFunc(GL_ONE, GL_ONE); в любом случае звучит неправильно, если только вы действительно не хотите добавлять значения. Я думаю, вы ищете glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

person datenwolf    schedule 26.02.2011
comment
Ты хоть представляешь, как я могу это сделать? Есть ли какой-то алгоритм для вырезания скрытых частей полигона скайбокса в меньший, который я мог бы предотвратить от рендеринга? Я, наверное, не первый, кто сталкивается со случаем, когда несколько прозрачных вещей конфликтуют с другими. - person dimcaron144; 27.02.2011
comment
Чтобы смешивание работало правильно, вы должны отсортировать части в обратном порядке. Затем вы, конечно же, не захотите использовать функцию смешивания GL_ONE, GL_ONE, так как это заставит вещи просвечиваться. Я почти уверен, что вам нужно смешивание, контролируемое альфа-каналом (пока вы не используете альфа-канал). - person datenwolf; 27.02.2011