2013-06-02 2 views
2

Я так долго пытаюсь найти, как это сделать: Обрезание за пределами определенной области в OpenGL.OpenGL - Обрезание в 3D-пространстве

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

Я хочу определить что-то вроде: «если этот пиксель имеет x менее 10 единиц, не рисуйте его». Что-то вроде: «нормально рисовать, если x находится между 10-20 и у между 10-20 и z составляет 10-20, в противном случае не отображать пиксель».

Сноска: Sucks, что stackoverflow требует от вас зарегистрироваться, чтобы задать вопрос. Раньше было лучше, когда сайт был открыт, а создание учетной записи было необязательным.

ответ

2

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

Java код (я использую LWJGL):

DoubleBuffer eqn1 = BufferUtils.createDoubleBuffer(8).put(new double[] {-1, 0, 0, 100}); 
eqn1.flip(); 
GL11.glClipPlane(GL11.GL_CLIP_PLANE0, eqn1); 
GL11.glEnable(GL11.GL_CLIP_PLANE0); 

Как обычно OpenGL плохо (как плохо, не так легко понять) документированы и мне пришлось искать вокруг, пока, наконец, я нашел некоторые, что объяснил это на каком-то форуме (и показал, что буфер должен быть перевернут): первые три удвоения являются нормалием плоскости отсечения, последняя (100) - это то, что далеко от начала мира (0,0,0) от плоскости.

Таким образом, если камера смотрит прямо на (0,0,0), этот примерный код выше будет создавать плоскость с правой стороны, что делает OpenGL не отображать материал справа от него. Плоскость расположена на x = 100 и обращена влево (-1).

Я надеюсь, что это будет результат поиска людей, которые ищут ответ на этот вопрос в будущем.

0

Фиксированная функция имеет пользовательские плоскости отсечения для этого, см. glClipPlane() для деталей. Вы можете определить 6 из этих самолетов, чтобы добиться эффекта, о котором вы говорили.

Современный шейдерный GL обеспечивает массив выходных переменных gl_ClipDistance[] для реализации таких вещей.

Тестирование, которое вы описываете, похоже, является фрагментом, поэтому вы также можете сделать это в шейдере фрагмента, отбросив все фрагменты за пределами вашей области. Но это будет довольно неэффективно (и не позволит использовать ранний тест Z), поэтому вы должны быть осторожны. Вероятно, это могло бы сочетаться с тестом на трафарет, чтобы ограничить x и y и выполнить тест на z в шейдере.

+0

Спасибо за ответ, уже понял это за минуту до этого. Но я посмотрю на предмет gl_clipDistance. – user2445741

+0

Btw, я читал, что у какого-то парня может быть только один клип-самолет на его карте gfx. Вы знаете, если это распространено? Если я не могу даже сделать шесть плоскостей клипов, которые будут работать на большинстве карт gfx, это кажется плохим решением. Есть ли другой способ? Можно ли клип использовать круг (стоит спросить, может быть, вы знаете)? Например, камера находится в середине сферы, а материал вне сферы не нарисован? – user2445741

+0

@ user2445741: Например, спецификация OpenGL гарантирует не менее 6 определяемых пользователем плоскостей отсечения. Минимальный размер массива 'gl_ClipDistance []' не менее 8 по спецификации GLSL3.3. – derhass

 Смежные вопросы

  • Нет связанных вопросов^_^