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

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

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

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

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

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

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

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

Dimitri

2 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам