2016-01-19 10 views
0

В настоящее время я работаю над проектом с использованием OpenGL-ES 3.0 для Android. В моем проекте я нарисовал трехмерную человеческую голову, чей центр тяжести лежит в начале. У меня также есть цилиндр с центром одной из его граней, лежащих в начале координат. Цилиндр удлиняется дольше, чем длина головки. Другими словами, у меня есть цилиндр, проходящий через голову.OpenGLES 3.0, Android: Как нарисовать пересечение двух объектов

Прямо сейчас, я использую только глубинный тест по умолчанию (GL_LESS), чтобы НЕ нарисовать участок цилиндра, который лежит внутри головы. Что было бы идеально для моего проекта, если бы я мог как-то просто нарисовать круг, где цилиндр пересекается с головой. Я попытался изменить свой тест глубины на (GL_EQUAL), но это не помогло.

Как это сделать? Имейте в виду, что головной объект очень сложный, с большим количеством точек и треугольников.

ответ

0

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

Один из подходов заключается в том, что вы передаете исходные координаты из вершинного шейдера в шейдер фрагмента. Скажем, у вас в настоящее время имеют типичную вершинный шейдер, который применяет преобразование MVP:

uniform mat4 MvpMat; 
in vec4 InPos; 
... 
gl_Position = MvpMat * InPos; 

Вы можете продлить это:

uniform mat4 MvpMat; 
in vec4 InPos; 
out vec4 OrigPos; 
... 
    gl_Position = MvpMat * InPos; 
    OrigPos = InPos; 

Затем в пиксельный шейдер (для цилиндра с заданным радиусом вдоль г -axis):

uniform float CylRad; 
in vec4 OrigPos; 
... 
    if (dot(OrigPos.xy, OrigPos.xy) > CylRad * CylRad) { 
     discard; 
    } 

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

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

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

+0

Я не понимаю, как отбросить правильные фрагменты. Полагаю, я не полностью объяснил, что я хотел. У меня есть сложная трехмерная головка, чей центр тяжести находится в начале координат. У меня есть цилиндр, а центр одной из его верхних круговых граней лежит в начале координат. Цилиндр может вращаться вокруг начала координат (и так может быть и голова). С помощью тестов глубины я могу скрыть часть цилиндра внутри головки, но см. Часть цилиндра вне головы. Я бы предпочел только круг, где цилиндр пересекается с головой. Поэтому мне нужно отбросить фрагменты цилиндра, а не фрагменты за пределами цилиндра. – brohan322

+0

В принципе, мне было интересно, если бы был подход, который я мог бы использовать, используя глубинное тестирование. – brohan322

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

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