Мне нужно закрепить несколько сотен объектов под плоскостью отсечения в OpenGL ES 2.0 и по достоинству оценят идеи от людей, более опытных с этим подмножеством OpenGL.
В OpenGL ES 1.x есть glClipPlane. На рабочем столе у вас есть glClipPlane или gl_ClipDistance в вашем шейдере. Ни один из этих двух не доступен в OpenGL ES 2.0. Кажется, что такая функциональность полностью исчезла с 2.0.
Кажется, единственный способ сделать это - либо A) запустить уравнение плоскости в шейдере фрагмента, либо B) написать очень сложный шейдер вершин, который позиционирует вершины на плоскости, если они находятся за ней.
(A) будет медленным по сравнению с glClipPlane, так как "регулярное" отсечение выполняется после вершинного шейдера и перед шейдером фрагмента, каждый фрагмент все равно придется частично обрабатывать и отбрасывать.
(B) было бы очень сложно сделать совместимость между шейдерами, так как мы не можем отбрасывать вершины, мы должны выровнять их с плоскостью и отрегулировать атрибуты для тех, которые "вырезаны". Невозможно интерполировать между вершинами в шейдере, не пересылая все вершины в текстуре и пробовать его, что было бы чрезвычайно дорого. Часто, вероятно, было бы невозможно интерполировать данные в любом случае.
Я также думал о выравнивании ближней плоскости с плоскостью отсечения, которая была бы эффективным решением.
И рисование плоскости после рендеринга всей сцены и проверка на глубину-сбой тоже не сработают (если вы не приближаетесь к перпендикуляру к плоскости).
Что работает для одного объекта - это нарисовать плоскость в буфере глубины, а затем визуализировать объект с помощью glDepthFunc (GL_GREATER), но, как и ожидалось, он не работает, когда один из объектов находится за другим. Я попытался перейти к этой концепции, но в итоге оказался чем-то очень похожим на теневые тома и так же дорого.
Так что мне не хватает? Как бы вы сделали обрезку плоскости в OpenGL ES 2.0?