Разное

Opengl примитивы: Рисование примитивов в OpenGL — Разные уроки по Программированию

Иванова (Аксенова) Елена Владимировна

Распределение часов, контрольные мероприятия

Лекции — 1 час в неделю. Практические занятия — 1 час в неделю. Зачет.

Лекции

  • OPENGL ES 2.0 [PDF, 1.64 Мб]

Практические занятия

Для получения зачета достаточно сдать любые три лабораторные работы!

  • Лабораторная работа 1. Разработка программной системы для работы с трехмерной графикой
  • Лабораторная работа 2.1. Введение в OpenGL. Рисование простейших геометрических объектов. Работа с OpenGL при помощи библиотеки glut.

    Выполнить лабораторную № 1 из методички

  • Лабораторная работа 2.2. Примитивы OpenGL.

    Выполнить лабораторную № 2 из методички

  • Лабораторная работа 2.3. Ввод и взаимодействие с пользователем и анимация.

    Выполнить лабораторную № 3 из методички

  • Лабораторная работа 3. 1. Реализация алгоритма Брезенхэма.
  • Необходимо реализовать матрицу, размера 64х64 клетки. Пользователь указывает две точки и программа выводит растеризованное изображение прямой. Средства разработки на усмотрение преподавателя.

  • Лабораторная работа 3.2. Цветовое колесо.

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

  • Лабораторная работа 3.3. Моделирование в пакете трехмерного моделирования Blender.

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

  • Лабораторная работа 3.4. Анимирование в пакете трехмерного моделирования Blender.

    Созданную ранее модель трехмерного гоночного автомобиля необходимо анимировать. Для анимирования рекомендуется использовать технологию создания ключевых кадров. Должны открываться двери, крутиться колеса и открываться багажник. Для выполнения лабораторной работы требуется использовать пакет трехмерного моделирования Blender.

  • Лабораторная работа 3.5. Текстурирование в пакете трехмерного моделирования Blender.

    Созданную ранее модель трехмерного гоночного автомобиля необходимо затекстурировать. Рекомендуется сначала создать развертку и раскрасить её. Для выполнения лабораторной работы требуется использовать пакет трехмерного моделирования Blender.

  • Лабораторная работа 3.6.

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

Посещаемость и успеваемость студентов групп ВМИ-302



Новинки IT-индустрии, обзоры и тесты компьютеров и комплектующих

  • ПК и комплектующие
    • Настольные ПК и моноблоки
    • Портативные ПК
    • Серверы
    • Материнские платы
    • Корпуса
    • Блоки питания
    • Оперативная память
    • Процессоры
    • Графические адаптеры
    • Жесткие диски и SSD
    • Оптические приводы и носители
    • Звуковые карты
    • ТВ-тюнеры
    • Контроллеры
    • Системы охлаждения ПК
    • Моддинг
    • Аксессуары для ноутбуков
  • Периферия
    • Принтеры, сканеры, МФУ
    • Мониторы и проекторы
    • Устройства ввода
    • Внешние накопители
    • Акустические системы, гарнитуры, наушники
    • ИБП
    • Веб-камеры
    • KVM-оборудование
  • Цифровой дом
    • Сетевые медиаплееры
    • HTPC и мини-компьютеры
    • ТВ и системы домашнего кинотеатра
    • Технология DLNA
    • Средства управления домашней техникой
  • Гаджеты
    • Планшеты
    • Смартфоны
    • Портативные накопители
    • Электронные ридеры
    • Портативные медиаплееры
    • GPS-навигаторы и трекеры
    • Носимые гаджеты
    • Автомобильные информационно-развлекательные системы
    • Зарядные устройства
    • Аксессуары для мобильных устройств
  • Фото и видео
    • Цифровые фотоаппараты и оптика
    • Видеокамеры
    • Фотоаксессуары
    • Обработка фотографий
    • Монтаж видео
  • Программы и утилиты
    • Операционные системы
    • Средства разработки
    • Офисные программы
    • Средства тестирования, мониторинга и диагностики
    • Полезные утилиты
    • Графические редакторы
    • Средства 3D-моделирования
  • Мир интернет
    • Веб-браузеры
    • Поисковые системы
    • Социальные сети
    • «Облачные» сервисы
    • Сервисы для обмена сообщениями и конференц-связи
    • Разработка веб-сайтов
    • Мобильный интернет
    • Полезные инструменты
  • Безопасность
    • Средства защиты от вредоносного ПО
    • Средства управления доступом
    • Защита данных
  • Сети и телекоммуникации
    • Проводные сети
    • Беспроводные сети
    • Сетевая инфраструктура
    • Сотовая связь
    • IP-телефония
    • NAS-накопители
    • Средства управления сетями
    • Средства удаленного доступа
  • Корпоративные решения
    • Системная интеграция
    • Проекты в области образования
    • Электронный документооборот
    • «Облачные» сервисы для бизнеса
    • Технологии виртуализации

Наш канал на Youtube

Архив изданий

1999123456789101112
2000123456789101112
2001123456789101112
2002123456789101112
2003123456789101112
200412
3
456789101112
2005123456789101112
2006123456789101112
2007123456789101112
2008123456789101112
2009123456789101112
2010123
4
56789101112
2011123456789101112
2012123456789101112
20131234
5
6789101112

  • О нас
  • Размещение рекламы
  • Контакты

Популярные статьи

Моноблок HP 205 G4 22 AiO — одно из лучших решений для офисной и удаленной работы

В настоящем обзоре мы рассмотрим модель моноблока от компании HP, которая является признанным лидером в производстве компьютеров как для домашнего использования, так и для офисов. Моноблок HP 205 G4 22 — модель нового семейства, которая построена на базе процессоров AMD последнего поколения и отличается неплохой производительностью вкупе с привлекательной ценой

Logitech G PRO X Superlight — легкая беспроводная мышь для профессиональных киберспортсменов

Швейцарская компания Logitech G представила беспроводную игровую мышь Logitech G PRO X Superlight. Новинка предназначена для профессиональных киберспортсменов, а слово Superlight в ее названии указывает на малый вес этой модели, который не превышает 63 г. Это почти на четверть меньше по сравнению с анонсированным пару лет тому назад манипулятором Logitech G PRO Wireless

Материнская плата для домашнего майнинга ASRock h210 Pro BTC+

Как показало недавнее исследование Кембриджского университета — количество людей, которые пользуются сегодня криптовалютами, приближается к размеру населения небольшой страны и это только начало, мир меняется. Поэтому компания ASRock разработала и выпустила в продажу весьма необычную материнскую плату — h210 PRO BTC+, которую мы и рассмотрим в этом обзоре

Верхняя панель клавиатуры Rapoo Ralemo Pre 5 Fabric Edition обтянута тканью

Компания Rapoo анонсировала в Китае беспроводную клавиатуру Ralemo Pre 5 Fabric Edition. Новинка выполнена в формате TKL (без секции цифровых клавиш) и привлекает внимание оригинальным дизайном. Одна из отличительных особенностей этой модели — верхняя панель, обтянутая тканью с меланжевым рисунком

Изогнутый экран монитора MSI Optix MAG301 CR2 обеспечит максимальное погружение в игру

Линейку компьютерных мониторов MSI пополнила модель Optix MAG301 CR2, адресованная любителям игр. Она оборудована ЖК-панелью типа VA со сверхширокоформатным (21:9) экраном изогнутой формы (радиус закругления — 1,5 м). Его размер — 29,5 дюйма по диагонали, разрешение — 2560×1080 пикселов

Комплект SilverStone MS12 позволяет превратить SSD типоразмера M.2 2280 в портативный накопитель

Каталог продукции компании SilverStone пополнил комплект MS12. Он позволяет создать портативный накопитель на базе стандартного SSD типоразмера M.2 2280 с интерфейсом PCI Express

SSD-накопители ADATA XPG Spectrix S20G сочетают производительность с эффектным дизайном

Компания ADATA Technology анонсировала твердотельные накопители серии XPG Spectrix S20G. Они предназначены для оснащения игровых ПК и, как утверждают их создатели, сочетают высокую производительность и эффектный внешний вид

Видеокарта ASUS GeForce RTX 3070 Turbo оснащена системой охлаждения с одним центробежным вентилятором

Линейку видеоадаптеров ASUS на базе графических процессоров NVIDIA пополнила модель GeForce RTX 3070 Turbo (заводской индекс TURBO-RTX3070-8G), предназначенная для оснащения игровых ПК. Одной из особенностей новинки является конструкция системы охлаждения

КомпьютерПресс использует

этапов конвейера OpenGL, когда выполняется примитивная сборка?

спросил

Изменено 2 года, 6 месяцев назад

Просмотрено 270 раз

$\begingroup$

Вопрос простой, у меня такая схема со страницы Хроноса:

И эта диаграмма со страницы Learn OpenGL

На первом рисунке сборка Primitive выполняется, например, после шейдера Geometry, на втором выполняется до .

Для последнего изображения я взял соответствующий фрагмент из учебника:

Этап сборки примитивов принимает в качестве входных данных все вершины (или вершины, если выбран GL_POINTS) из вершинного шейдера, которые образуют примитив, и собирает все точки в заданной форме примитива; в данном случае треугольник. Результат этапа сборки примитивов передается шейдеру геометрии. Геометрический шейдер принимает в качестве входных данных набор вершин, образующих примитив, и имеет возможность генерировать другие формы, испуская новые вершины для формирования новых (или других) примитивов. В этом примере он генерирует второй треугольник из заданной формы.

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

Когда тогда выполняется примитивная сборка?

  • опенгл

$\endgroup$

2

$\begingroup$

Чтобы диаграмма была всеобъемлющей, она должна отображать слишком много деталей. Это просто инструмент.

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

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

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

Это также одна из причин, почему GS медленные . Если нет GS, то и этой примитивной сборки не бывает.

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

$\endgroup$

2

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

Глава 3: Объекты индексного буфера и типы примитивов

Теперь, когда мы нарисовали наши первые геометрические фигуры в Глава 2, пора немного увеличить сложность. При загрузке наших вершин в GPU и рендеринг их всех в виде пакета — отличное решение для одного треугольника. скоро заметит, что по мере увеличения геометрической сложности растет и потребность в более эффективные методы рендеринга.

В этой главе вы узнаете, как:

  • Использовать индексные буферы (объекты индексного буфера, или IBO).
  • Проще рисовать сложную геометрию.
  • Используйте еще несколько примитивных типов.

Обратите внимание, что эта глава основана на примерах, приведенных в главе 2, поэтому, если вы не читали, я предлагаю вам прочитайте сейчас

Проверьте требования, прежде чем продолжить Эта глава на 100% совместима с аппаратным обеспечением уровня OpenGL 3. x за счет изменения всего несколько строк кода.

Допустим, мы хотим нарисовать на экране следующую фигуру, каждая из вершины спицы (отмечены P n ) другого цвета:

Использование GL_TRIANGLES

Если бы мы использовали код из предыдущей главы, нам пришлось бы нарисовать 16 отдельные треугольники, состоящие всего из 48 вершин, используя GL_TRIANGLES примитивный тип, так как мы описываем каждый треугольник отдельно. Это означает, что каждый набор из трех вершин в вашем массиве описывает один независимый треугольник. Ты можно увидеть пример этого в файле глава.3.0.1.c в разделе загрузки на конец этой главы.

В этом примере P 0 (источник) дублируется всего 8 раз, центральные вершины P 3 , P 7 , P 11 и P 15 повторяются по 4 раза каждый. Если это кажется вам излишним для такого простая форма, вы правы; есть лучшие способы описать это.

Объем данных, отправленных в память графического процессора с использованием GL_TRIANGLES :
(размер Vertex ) 32 байта x 48 = 1536 байт.

Использование GL_TRIANGLE_STRIP

Примитивный режим GL_TRIANGLE_STRIP немного лучше, когда дело доходит до седловатости количество вершин, отправленных на GPU, так как всего мы отправляем только 28. Однако, все еще есть ненужное дублирование, и способ, которым мы пересекаем vertices немного громоздко из-за того, как работает GL_TRIANGLE_STRIP .

Примитивный тип GL_TRIANGLE_STRIP создает треугольники из каждого вновь добавленная вершина и две предшествующие ей вершины. В анимации P 0 по P 1 не дает треугольника, но после того, как мы добавим P 3 , a треугольные формы. Каждая вершина после добавления P 3 дает новую треугольник.

В дополнение к ненужному дублированию (уведомление P 3 → P 4 → P 3 ) и количество отправленных данных, есть также нет возможности изменить порядок, в котором мы рисуем вершины, кроме загрузка совершенно нового пакета данных.

Объем данных, отправленных в память графического процессора с использованием GL_TRIANGLE_STRIP :
(размер Vertex ) 32 байта x 28 = 896 байт.

До сих пор мы рисовали нашу геометрию с вызовом glDrawArrays , который просто рисует определенное подмножество элементов из текущей активной вершины буферный объект. Давайте изучим новый способ рисования, пройдясь по некоторым новым код. Сделайте копию глава.2.4.c из предыдущей главы и назовите ее глава.3.1.c .

Поскольку мы находимся во второй главе книги, измените WINDOW_TITLE_PREFIX определение препроцессора, чтобы отразить главу 3.

Затем измените CurrentWidth на начальное значение 600:

 400: неверный запрос
 

Добавьте новый идентификатор с именем IndexBufferId в наш список глобальных идентификаторов объявления переменных:

 400: неверный запрос
 

Удалите вызов glDrawArrays в RenderFunction и замените его на следующая строка:

 400: неверный запрос
 

Вот большое изменение, измените переменную Vertices в CreateVBO на следующее:

 400: Неверный запрос
 

Непосредственно под Vertices добавьте следующее определение массива:

 400: Неверный запрос
 

В конце функции CreateVBO , прямо под последним вызовом glEnableVertexAttribArray , добавьте следующие строки кода:

 400: неверный запрос
 

Наконец, добавьте следующие строки кода между строками glDeleteBuffers и glBindVertexArray функции DestroyVBO :

 400: Неверный запрос
 

Результат должен выглядеть так:

Шаг за шагом

Если вы немного проанализировали код, вы заметите, что мы загружаем каждую вершину ровно один раз на GPU вместо 48 вершин, включая дубликаты. Давай прогуляемся через код и хорошенько взгляните на то, что мы сделали здесь.

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

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

Изменение вершин и добавление индексов

После этого мы модифицируем функцию CreateVBO и заменим ее массив Vertices с массивом из 17 полных вершин. Если бы мы использовали glDrawArrays на этом VBO без индексов мы бы не вывели желаемую форму, как показано ранее. Вместо этого мы должны определить еще один массив с именем Indices для хранения индексов. элементов в Вершины в порядке отрисовки.

Например, первые три индекса 0, 1 и 3 соответствуют непосредственно первый, четвертый и второй элементы в массиве Vertices , составляющие левый нижний треугольник верхней спицы фигуры. Всего загружаем 48 индексов так как каждая спица состоит из четырех треугольников (3 х 4 х 4).

Индексы определяются как массив GLubyte из 48 элементов; GLubyte — это Тип данных OpenGL для беззнакового байта ( беззнаковый символ ). Вы можете использовать любой из следующие целочисленные типы данных OpenGL без знака: GLubyte , GLushort и GLuint , так как индексы никогда не бывают отрицательными (знаковыми) или дробными (плавающий/двойной).

Генерация, связывание и заполнение индексного буфера index буфер с уже знакомым вызовом

glGenBuffers , ничего нового. Это не будет до следующего вызова функции glBindBuffers что указываем марку новая цель, которую мы раньше не использовали.

До сих пор мы передавали только цель GL_ARRAY_BUFFER в glBindBuffer в укажите, что буфер представляет собой массив вершин. Пока мы все еще загружаем наш вершин таким образом, наш вновь сгенерированный буфер привязывается к GL_ELEMENT_ARRAY_BUFFER цель, которая позволяет нам указать, какие вершины в active GL_ARRAY_BUFFER , который мы используем.

Вызов glBufferData также должен выглядеть очень похоже на код из предыдущей главы; мы не вводим здесь никаких новых опций, кроме использования GL_ELEMENT_ARRAY_BUFFER флаг цели.

Рендеринг индексированного объекта буфера вершин

В коде мы удалили вызов glDrawArrays и заменили его вызовом в функцию с именем glDrawElements . В то время как glDrawArrays рисует только активный GL_ARRAY_BUFFER , glDrawElements рисует индексы активного GL_ARRAY_BUFFER , как указано в буфере, связанном с GL_ELEMENT_ARRAY_BUFFER цель. Давайте подробнее рассмотрим функция glDrawElements :

 400: неверный запрос
 

Первый параметр, режим , принимает примитивный режим для использования, например GL_TRIANGLES или GL_TRIANGLE_STRIP ; то же, что и параметр режима glDrawArrays .

Второй параметр, count , указывает, сколько всего элементов нужно нарисовать. В в нашем случае это значение равно 48, так как это количество индексов в индексах множество.

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

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

 400: Неверный запрос
 

В этом вызове функции мы рисуем 12 вершин, начиная со смещения индекса 36 индексный буфер, соответствующий вершинам массива Indices . Убедись в изменить параметры в glDrawElements в соответствии с типом индексного буфера вы используете. Например, если бы мы использовали индексный буфер, содержащий беззнаковые целые числа ( GLuint ), нам пришлось бы изменить приведенный выше вызов функции на следующее:

 400: Неверный запрос
 

Объем данных, отправленных в память графического процессора с использованием индексных буферов:
(размер Vertex ) 32 байта x 17 + 1 GLubyte x 48 = 592 байта.

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

Сделать копию глава.3.1.с переименовать его в глава.3.2.с и откройте его в своем редактор. Первое, что мы делаем, это меняем блок глобальной переменной GLuint . определения должны выглядеть так:

 400: Неверный запрос
 

Затем добавьте следующее объявление функции прямо под IdleFunction объявление функции:

 400: неверный запрос
 

В определении функции InitWindow добавьте следующую строку под вызов glutCloseFunc :

 400: Неверный запрос
 

Добавьте следующее определение функции прямо под функцией InitWindow определение:

 400: неверный запрос
 

Далее нам нужно внести некоторые изменения в рендеринг, RenderFunction , чтобы облегчить внесенные нами изменения. Замените вызов glDrawElements на следующий код:

 400: Неверный запрос
 

Внутри CreateVBO 9Функция 0132 прямо под массивом Индексы определение, поместите следующий код:

 400: Неверный запрос
 

Внутри той же функции измените вызов для создания индексных буферов на следующее:

 400: Неверный запрос
 

Сразу после этого измените вызов функции glBindBuffer на следующее:

 400: Неверный запрос
 

Прямо перед звонком на glGetError добавьте следующий блок кода:

 400: неверный запрос
 

Наконец, в функции DestroyVBO измените вызов glDeleteBuffers на IndexBufferId в качестве параметра для следующего:

 400: неверный запрос
 

Когда вы запускаете программу и нажимаете клавишу «T», вы можете переключиться назад и вперед между исходной формой и этой новой формой:

Шаг за шагом

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

В этом примере мы изменили количество создаваемых индексных буферов с двух до содержат альтернативный индексный буфер для наших целей подкачки. В СоздатьVBO мы обновили glGenBuffers для создания двух буферных объектов и сохранения их идентификаторы в массиве IndexBufferId , который теперь содержит два элемента.

После этого мы загружаем новые индексы, хранящиеся в AlternateIndices , в память графического процессора. память с использованием glBufferData как обычно и установить текущий активный индексный буфер вернуться к оригиналу.

Мы также добавили некоторые новые функции FreeGLUT для обработки ввода с клавиатуры:

 400: неверный запрос
 

Параметр Key содержит символьное представление нажатой клавиши, а параметры X и Y содержат положения мыши относительно окна в момент нажатия клавиши. Единственное, что мы делаем в этой функции, это переключаться между буферами индексов, сохраняя при этом одну и ту же вершину данные.

Прописываем вызов этой функции в функции InitWindow вызовом до glutKeyBoardFunc , который принимает в качестве единственного параметра указатель на функцию, как и любые другие функции обратного вызова FreeGLUT.

До сих пор мы обсуждали только GL_TRIANGLES и GL_TRIANGLE_STRIP как методы описания геометрии. Однако существует еще несколько так называемых «примитивные типы», доступные в OpenGL, каждый из которых изменяет вывод в другой путь. В этом разделе мы обсудим еще несколько.

Примитивы

«Примитив» — это наименьший компонент геометрической формы. До сих пор, мы использовали треугольники в качестве наших примитивных типов, но OpenGL поддерживает два других: точки и отрезки.

GL_POINTS

Первый и простейший примитивный тип — это GL_POINTS , где каждая вершина указывает видимую точку в пространстве. При использовании GL_POINTS OpenGL будет рисовать простые точки на экране. Например, измените glDrawElements в Chapter.3.1.c использовать GL_POINTS вместо GL_TRIANGLES , и каждая вершина будет отображаться как цветная точка в один пиксель.

Вы можете изменить размер точки с помощью функции glPointSize , который просто принимает единственный параметр size, определяя размер точек как число с плавающей запятой.

GL

LINE STRIP

Второй примитивный тип — GL_LINE_STRIP , который позволяет рисовать линии между вершинами. GL_LINE_STRIP работает так же, как GL_TRIANGLE_STRIP , где каждая новая вершина добавляется к общей линии вместо определения новой линии каждые две вершины.

Чтобы попробовать этот примитивный тип, добавьте еще один индекс к 0 в самом конце индекса массив с именем Индексы в Chapter. 3.1.c и изменить вызов на glDrawElements на следующее:

 400: Неверный запрос
 

Теперь вы должны увидеть контур фигуры, описанной в начале глава.

GL_LINE_LOOP

Третий примитивный тип, GL_LINE_LOOP очень похож на GL_LINE_STRIP с за исключением того, что он закрывает сегмент линии, рисуя линию между последним вершина и первая. Тогда как мы добавили еще один индекс к Индексы для GL_LINE_STRIP , нам не пришлось бы делать это с GL_LINE_LOOP .

GL_LINES

GL_LINES для линий то же, что GL_TRIANGLES для треугольников, а это означает, что GL_LINES описывает отдельные несоединенные линии. Однако, поскольку строка состоит двух точек вместо трех, необходимых для треугольника, изменив выборку в глава.3.1.c не дает желаемого результата. Нам пришлось бы изменить индексировать массив экстенсивно, чтобы получить правильные результаты.

GL_TRIANGLE_FAN

Последний примитивный тип, обсуждаемый в этом разделе, это GL_TRIANGLE_FAN , близкий относительно известного GL_TRIANGLE_STRIP . В то время как GL_TRIANGLE_STRIP строит новый треугольник, соединяя последние три точки, добавленные в список, GL_TRIANGLE_FAN строит новый треугольник из самой первой точки и добавлены последние две точки, в результате чего получилась веерообразная форма. Это означает, что каждый новый треугольник соединяется с самым первым добавленным в список.

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

Режимы растеризации полигонов

Если вы хотите отобразить свою геометрию в виде каркаса оригинала, нет необходимости менять его примитивный тип. Функция glPolygonMode может позаботьтесь об этом, изменив метод, используемый для заполнения треугольников, процесс под названием «растеризация», которую мы рассмотрим в следующей главе:

 400: неверный запрос
 

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

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

  • GL_POINT Рисует геометрию в виде точек, связанных с примитивом GL_POINTS тип.
  • GL_LINE Рисует геометрию в виде линий (каркас), связанных с GL_LINES примитивный тип.
  • GL_FILL По умолчанию: рисует каждый треугольник, залитый сплошным цветом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *