Проблема смешивания OpenGL с прозрачным скайбоксом и прозрачной картой высот - PullRequest
0 голосов
/ 26 февраля 2011

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

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

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

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

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

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

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

Dimitri

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

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

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

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

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

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

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

0 голосов
/ 27 февраля 2011

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

...