Только что, спустя 40 минут поиска ошибки, сделал открытие: даже если у вас есть константный массив float’ов, хардкодом забитый в шейдер вершин, openGL ничего не отрисует, если не установлен VAO.
Разбираюсь в этой теме сам и заодно помогу другим. Есть прекрасная статья, демонстрирующая реальное применение аппаратной тесселяции на различных примерах. Привожу вольный пересказ (который никак не относится к самой главе и к её содержанию, все совпадения — случайны) этой статьи о генерации ландшафта + даю некоторые ссылки, которые объясняют те или иные термины. В конце статьи будет ссылка на готовый пример. Всё, что в тексте будет курсивом или оформлено как спойлер — это мои дополнения, которые я разжёвывал прежде всего для себя. Если кто-то читает эту статью и ему важен прежде всего её смысл — не читайте текст курсивом.
Чтобы продемонстрировать потенциал использования тесселяции, мы рассмотрим простую систему рендеринга местности, основанную на четырёхугольных патчах и displayment mapping. Displaysment map (карта сдвигов) — это текстура, которая содержит сдвиги поверхности в каждой точке. [spoiler title=’Что такое displayment mapping на примере’ style=’green’ collapse_link=’true’]Для примера — мы создали некоторую сетку, из координат которой составили некоторую плоскость. Она растянута в нашей 3D-сцене по координатам x и z. Координата y по всей поверхности — занулена. Тем самым мы получаем гладкую 2D-поверхность из квадратов. Координату y нужно как-то обработать и сделать это таким образом, чтобы на этой поверхности возникли горы и овраги, и всё это было более-менее плавно. Для этого используется карта высот (некоторая структура, хранящая значение координаты y для каждой точки плоскости) и displayment mapping, обычно, подразумевает формирование такой карты высот через текстуру, загруженную в вершинный шейдер. [/spoiler] Читать далее →
Тесселяция способна на прекрасные вещи. (Картинка не имеет никакого отношения к статье, кроме тесселяции. Она просто для привлечения вашего внимания)
На хабре есть прекрасная статья от 2016 года, рассказывающая как отрендерить на сцене динамическую растительность, красиво развивающуюся под действием «ветра». Там же, в самом начале статьи, приложена ссылка на github автора, и он крайне советует читать код по мере изучения материала статьи. Я же в данной статье постараюсь дать подробные комментарии к его шейдеру управления тесселяции (далее просто шейдер тесселяции) и приведу немного ссылок по тесселяции в OpenGL, которые могут оказаться полезными.
Столкнулся с интересной темой — надо загрузить в видеопамять большое (относительно) количество шума. Под шумом понимается некоторое количество равномерно распределённых случайных чисел, иначе говоря — случайных чисел из одного интервала.
Решение известно давно, но мало где описывается, поэтому продублирую сюда с некоторыми пояснениями, на поиск которых я потратил некоторое время.
Первым делом объявляем класс, который с помощью внешнего источника генерирует начальные данные для последующего их использования в генераторе:
QOpenGLFunctions_4_1_core: no such file or directory
при попытке сборки проекта клонированного с git посредством qmake и make. В системе стоял как QT4, так и QT5.
В чём была проблема
Класс QOpenGLFunctions_4_1_core появился, согласно документации, в QT5, а qmake подтягивал для сборки инклюды от QT4.
Решение
Решение оказалось тривиальным, но от незнания особенностей инструментов поиски его заняли порядочно времени:
$ qmake --version
QMake version 2.01a
Using Qt version 4.8.7 in /usr/lib/x86_64-linux-gnu
$ qmake -qt=qt5 --version
QMake version 3.0
Using Qt version 5.5.1 in /usr/lib/x86_64-linux-gnu
$ QT_SELECT=qt5 qmake --version
QMake version 3.0
Using Qt version 5.5.1 in /usr/lib/x86_64-linux-gnu
Не понимаешь как работают указатели? Для чего они нужны? Запутался в этом потоке звездочек и амперсандов? Ты попал куда надо. Настало время дать им последний бой и разобраться раз и навсегда с ними.
На заре третьего курса приспичило мне решить задачу, которую дают курсу первому. Звучала они именно так, как описано в заголовке, но с небольшой правкой — удалить нужно одну вершину.
Как задаётся дерево, как задаётся граф, как всё это выводится — не сказано.
Цель заметки — бери код, что я написал, если тебе нужно решить данную задачу. Я вот его в сети не нашёл, и пришлось писать. А так, может, кому-то и поможет. Пока гуглил, пришёл к выводу, что во многих университетах это задание есть на курсовую работу.
Небольшая заметка, надеюсь, кому-то будет полезна.
Интро.
Временами приходится работать с CMS bitrix, и так как я студент 3-его курса и это моя первая работа так или иначе «около специальности», то многому я учусь. И сегодня предо мной встала такая задача: кастомизировать определённым образом компонент news.list, и передать данные из него на другую страницу, где лежит такой же news.list. Вообще, эти 2 news.list’а реализуют подобие галереи. Почему я не использую стандартную галерею или не возьму комплексный компонент — даже не спрашивайте. Первый news.list — это аналог catalog.section.list — он просто выводит данные из инфоблока, причём специфично. В инфоблоке находятся разделы (это вроде как альбомы с видеозаписями). В каждом разделе будет много видеозаписей. У каждого альбома задаётся preview-изображение и само-собой название. Вывести нужно было и изображение, и название, и последние 2 добавленных видео. В качестве видео выступают элементы инфоблока, лежащие в текущем разделе. У них заданы preview-картинка и ссылка на youtube-видео.
По-работе пришлось исправлять странный баг. Суть была такова: есть некий сайт, работает он на bitrix’е. Сайт крутится на сервере под управлением centOS. В одном из разделов сайта залит форумный движок SMF — типичный такой форум, без особых наворотов.
Так вот работал себе этот форумный движок на этом сервере много лет, а тут что-то произошло и появились странные баги: