Можно ли использовать вершинный шейдер для отображения моделей нормалей? - PullRequest
2 голосов
/ 24 октября 2009

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

Ответы [ 3 ]

6 голосов
/ 25 октября 2009

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

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

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

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

1 голос
/ 01 июня 2010

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

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

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

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

0 голосов
/ 24 октября 2009

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

...