Проблема смешивания 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);