2009-10-23 3 views
2

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

ответ

6

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

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

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

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

+0

geometry shader: вот что я ищу ... Спасибо! – geowar

0

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

+0

После выполнения всей работы по размещению всех текстовых кодов, нормалей и вертов в VBO это просто кажется большой работой, чтобы сделать все это снова, чтобы увидеть нормали ... Мы не говорим о нескольких строках ... больше нравится 10K +. Надеюсь на более легкое (временное) решение ... спасибо за ответ. ;-) – geowar

+1

@geowar: 10k строк источника? Что вы делаете с вашей моделью, которая требует много кода? Во всяком случае, я не понимаю, почему это важно; просто вытащите вершины и нормали из массива, который вы передаете glDrawArrays(), введите режим линии и нарисуйте кучу строк. –

+0

не 10K линий источника; 10K + точек данных уже в VBO.Использование геометрического шейдера позволяет повторно использовать данные VBO для рисования нормалей (для отладки). – geowar

1

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

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

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

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