Можно ли использовать вершинный шейдер для отображения моделей нормалей?

StackOverflow https://stackoverflow.com/questions/1616264

  •  06-07-2019
  •  | 
  •  

Вопрос

В настоящее время я использую VBO для координат текстуры, нормалей и вершин (3DS) модели, которую я рисую с помощью "glDrawArrays (GL_TRIANGLES, ...);". Для отладки я хочу (временно) показать нормали при рисовании моей модели. Должен ли я использовать немедленный режим, чтобы нарисовать каждую линию от вершины до вершины + нормаль -ИЛИ-напичкать другой VBO вершинами и вершинами + нормалью, чтобы нарисовать все нормали & # 8230; -ИЛИ- есть ли способ для вершинного шейдера использовать вершины и нормальные данные, уже переданные при рисовании модели, для вычисления V + N, используемого при рисовании нормалей?

Это было полезно?

Решение

Нет, невозможно нарисовать дополнительные линии из вершинного шейдера.

Вершинный шейдер - это не создание геометрии, а вычисление для каждой вершины. Используя вершинные шейдеры, когда вы говорите glDrawArrays (GL_TRIANGLES, 0,3) , именно это определяет, что именно вы будете рисовать, то есть 1 треугольник. Как только обработка достигает вершинного шейдера, вы можете только изменять свойства вершин этого треугольника , никоим образом не изменять форму или форму, топологию и / или счет геометрии.

Что вам нужно, так это то, что OpenGL 3.2 определяет как геометрический шейдер , который позволяет выводить произвольный счетчик геометрии / топологию из шейдера. Тем не менее, обратите внимание, что это поддерживается только через OpenGL 3.2, что не многие карты / драйверы поддерживают в настоящее время (он вышел уже несколько месяцев).

Однако я должен отметить, что отображение нормалей (в большинстве движков, которые поддерживают какую-либо отладку) обычно выполняется с помощью традиционного рендеринга строк с дополнительным буфером вершин, который заполняется правильными позициями (P, P + C * N) для каждой позиции сетки, где C - это константа, представляющая длину, которую вы хотите использовать для отображения нормалей. Это не так сложно написать ...

Другие советы

Вы можете приблизить это, нарисовав геометрию дважды. Один раз нарисуй, как обычно. Во второй раз нарисуйте геометрию как GL_POINTS и присоедините вершинный шейдер, который смещает каждую позицию вершины по нормали вершины.

Это приведет к тому, что ваша модель будет иметь набор точек, плавающих по поверхности. Каждая точка будет показывать направление нормали от вершины, которой она соответствует.

Это не идеально, но может быть достаточно, в зависимости от того, для чего вы собираетесь его использовать.

ОБНОВЛЕНИЕ: АГА! И если вы передадите постоянный коэффициент масштабирования вершинному шейдеру, и ваше приложение будет интерполировать этот коэффициент между 0 и 1 с течением времени, ваши точки, отображаемые вершинным шейдером, будут анимироваться с течением времени, начиная с вершины, к которой они применяются, а затем уплывает в направлении его нормального.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top