Обратный алгоритм отсечения Opengl? - PullRequest
2 голосов
/ 21 апреля 2011

В opengl у нас есть glClipPlane (), которая принимает плоское уравнение в виде Ax + через + Cz + D = 0. У меня есть 6 таких плоскостей, которые образуют куб. Но вместо того, чтобы показывать мир внутри куба, я хочу показать внешний мир. Например, если сфера входит внутрь куба, она должна обрезаться, но когда она выходит, этого не должно быть. Не уверен, но имеет ли это какое-то отношение к рисованию граней куба по часовой стрелке, поэтому нормальное будет вне поля зрения?

Ответы [ 5 ]

3 голосов
/ 22 апреля 2011

К сожалению, это невозможно из-за работы плоскостей клипов OpenGL. Поскольку все плоскости отсечения применяются к вершинам в вашем случае с перевернутым кубом, всегда будет как минимум 3 плоскости, которые обрезают.

Это специальное поведение плоскостей отсечения OpenGL, таким образом, дает вам одно важное ограничение: вы можете ограничивать только выпуклую область. Однако «перевернутый» куб не является выпуклым: в математических терминах выпуклый набор - это набор, в котором для любых двух заданных точек набора (кратчайшая) прямая линия между этими точками не лежит вне набора.

1 голос
/ 21 апреля 2011

Хотя я не знаком с точной работой плоскостей отсечения opengl, я предполагаю, что это имеет отношение к определению «обрезать» и «не обрезать» полупространства - будь то с нормальным вектором (A, B , C) или что-то подобное не должно быть проблемой.

Попробуйте перевернуть уравнение на каждой из плоскостей (-Ax -By -Cz -D = 0). Это должно изменить ориентацию плоскости (если только opengl не использует совершенно другой метод определения в космосе и космосе).

0 голосов
/ 28 мая 2013

Я использовал для отсечения исходного образца: GLdouble eqn1 [4] = {0,7, 0,7, 0,7, 0,0};и результат: enter image description here

Я использовал для отсечения исходного образца: GLdouble eqn1 [4] = {-0,7, - 0,7, -0,7, 0,0};и результат:

enter image description here

, поэтому вы можете использовать отрицательные a, b, c, d для отображения каждой стороны куба

0 голосов
/ 22 апреля 2011

Это похоже на то, что предложил Бахбар, но всего за 3 прохода. Это все еще было бы дорого, но вы могли бы:

  1. Запишите куб в буфер трафарета.
  2. Рендеринг всего, что не попадает на трафарет (рисует вещи по сторонам куба)
  3. Примените плоскости отсечения вперед (те, что в задней части куба)
  4. Рендеринг объектов поверх буфера трафарета (только рисует вещи полностью за кубом клипа)
  5. Примените плоскости скрепки, обращенные назад (перед кубом)
  6. Рендеринг с буфером трафарета снова (все полностью перед кубом клипа)

Если бы существовал второй буфер глубины, вы могли бы записать заднюю часть куба во второй буфер глубины и выполнить рендеринг, только если фрагмент меньше этого, но больше, чем первый буфер глубины. Затем вы можете визуализировать переднюю часть куба в буфер глубины, а затем сделать второй проход по сцене, чтобы визуализировать объекты перед кубом.

0 голосов
/ 22 апреля 2011

ИвоДанколов упоминает, что изменение коэффициентов изменяет сторону отсечения, но ... Каждая дополнительная плоскость отсечения обрезает геометрию больше , она никогда не позволит вам ограничить экстент предыдущей плоскости отсечения.

Короче говоря, вы не можете использовать плоскости отсечения, чтобы делать то, что вам нужно (если только вы не начнете рисовать свою геометрию 6 раз, и не будете использовать по 1 плоскости отсечения за раз, и не будете иметь дело с оверлеем. Это чертовски дорого ).

Тем не менее, вы можете вычислить, находится ли каждый фрагмент внутри или снаружи вашего куба непосредственно в шейдерном фрагменте, и discard соответствующим образом из внутренних фрагментов. По сути, это означает реализацию отсечения во фрагментном шейдере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...