В настоящее время я использую VBO для координат текстуры, нормалей и вершин модели (3DS), которую я рисую с помощью «glDrawArrays (GL_TRIANGLES, ...);». Для отладки я хочу (временно) показать нормали при рисовании моей модели. Должен ли я использовать немедленный режим для рисования каждой строки от vert до vert + normal -OR- наполнить другой VBO с помощью vert и vert + normal, чтобы нарисовать все нормали ... -OR- есть ли способ, чтобы вершинный шейдер использовал вершину и нормальные данные уже прошли при рисовании модели для вычисления V + N, используемого при рисовании нормалей?Могу ли я использовать вершинный шейдер для отображения нормалей моделей?
ответ
Нет, невозможно нарисовать дополнительные строки из вершинного шейдера.
Вершинный шейдер не о создании геометрии, а о выполнении на вершину вычислений. Используя вершинные шейдеры, когда вы говорите glDrawArrays(GL_TRIANGLES,0,3)
, это то, что точно определяет, что вы рисуете, т. Е. 1 треугольник. Как только обработка достигнет вершинного шейдера, вы можете изменить свойства вершин этого треугольника, никоим образом не изменяя форму или форму, топологию и/или количество геометрии.
Что вы ищете - это то, что OpenGL 3.2 определяет как геометрический шейдер, что позволяет выводить произвольное геометрическое число/топологию из шейдера. Обратите внимание, однако, что это поддерживается только OpenGL 3.2, что не так много карт/драйверов сейчас (это уже несколько месяцев).
Однако я должен указать, что отображение нормалей (в большинстве движков, поддерживающих некоторую отладку) обычно выполняется с помощью традиционного рендеринга линии, с дополнительным буфером вершин, который заполняется соответствующими позициями (P, P + C * N) для каждой позиции сетки, где C - константа, представляющая длину, которую вы хотите использовать для отображения нормалей. Это не так сложно написать ...
Возможно, вы получите более или менее правильный эффект с умело написанным вершинным шейдером, но это будет очень много работы. Так как это все равно для целей отладки, кажется, лучше просто нарисовать несколько строк; удар производительности не будет серьезным.
После выполнения всей работы по размещению всех текстовых кодов, нормалей и вертов в VBO это просто кажется большой работой, чтобы сделать все это снова, чтобы увидеть нормали ... Мы не говорим о нескольких строках ... больше нравится 10K +. Надеюсь на более легкое (временное) решение ... спасибо за ответ. ;-) – geowar
@geowar: 10k строк источника? Что вы делаете с вашей моделью, которая требует много кода? Во всяком случае, я не понимаю, почему это важно; просто вытащите вершины и нормали из массива, который вы передаете glDrawArrays(), введите режим линии и нарисуйте кучу строк. –
не 10K линий источника; 10K + точек данных уже в VBO.Использование геометрического шейдера позволяет повторно использовать данные VBO для рисования нормалей (для отладки). – geowar
Вы можете приблизиться к этому, рисуя геометрию дважды. Как только вы нарисуете его, как обычно. Во второй раз нарисуйте геометрию как GL_POINTS и прикрепите шейдер вершин, который смещает каждую вершину по нормали вершины.
Это приведет к тому, что ваша модель будет иметь множество точек, плавающих по поверхности. Каждая точка показывает направление нормали от вершины, которой она соответствует.
Это не идеально, но может быть достаточно, в зависимости от того, на что вы надеетесь использовать его.
ОБНОВЛЕНИЕ: AHA! И если вы передадите постоянный коэффициент масштабирования вершинному шейдеру и попросите ваше приложение интерполировать этот коэффициент между 0 и 1 с течением времени, ваши точки, отображаемые вершинным шейдером, будут анимироваться со временем, начиная с вершины, к которой они применяются, и затем плавает в направлении его нормального.
geometry shader: вот что я ищу ... Спасибо! – geowar