Как сделать адаптивное меню в ВК для группы (паблика, сообщества)

Кроме создания сайта, часто заказывают комплексное оформление аккаунтов соцсетей в едином стиле. Самое популярное – это создание меню в вк (для группы в контакте), оформление канала на ютубе и инстаграмма.

В этой статье я расскажу как сделать адаптивное меню для сообщества вк.

Для создания красивого меню – нужны мало мальские знания графических программ (фотошоп, гимп, корел, илюстратор).

Я делаю в фотошопе.

Для начала я нашел подходящие картинки. Очень хорошие изображения можно найти на фотостоках, но они платные (стоимость можно включить в стоимость заказа, если вы делаете меню на заказ).

Картинки для оформления группы вк

Из картинок собираем макеты для оформления группы:

  1. аватарка
  2. шапка группы
  3. кнопка вызова меню
  4. меню

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

Аватарка для группы вк

Ава обычно это логотип компании. Если логотипа нет, то вы можете скачать подходящий по теме файл на том же фотостоке и изменить его под себя.

Я так и сделал – скачал подходящий логотип и немного его доработал.

Размер аватарки рекомендую делать 200 x 200 px  (учтите что картинка будет обрезаться окружностью)

Выбор области для миниатюры (аватарки)

Шапка для группы вк

Шапка (обложка) группы это место для полета фантазии. Именно по обложке пользователи определяют о чем эта группа. Следовательно шапка должна передать тематику группы.

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

Размер шапки вк для ПК

Основной размер шапки 1590 x 400 px 

Размер шапки в VK для компьютера

Размер шапки вк в мобильном приложении

В мобильном приложении шапка обрезается. 83 px срежется сверху и по 197 px по бокам.

Видимая часть в приложении 1196 x 317 px (сюда должна поместится вся важная информация)

Размер шапки в ВК в приложении

Но в приложениях по бокам располагаются дополнительные элементы. Они тоже перекроют часть изображения. Ещё по 140 px слева и справа.

Элементы перекрывающие шапку группы ВК по бокам

Кстати! Вот тут можно посмотреть все размеры вк.

И так, у меня получилась вот такая шапка (обложка)

Готовая шапка для группы вконтакте

Теперь получившуюся картинку загружаем как обложку группы.
Делается это так:

Заходим в Управление

Обложка сообщества → Загрузить. И выбираем нашу картинку.

Как сделать меню в группе ВК

Меню в ВК делается с помощью wiki-разметки (это специальный язык программирования созданный для ВКонтакте).

Для меню нужно создать вики-страницу. Делается это так:

Скопируйте и вставьте в адресную строку такой код (с вашими данными)

http://vk.com/pages?oid=-123456789&p=МЕНЮ

Где 123456789 это порядковый номер (ID) вашей группы.

Взять его можно в адресной строке.

ID группы ВК

а МЕНЮ – это название страницы.

В результате у вас появится вот такая новая страница.

Новая вики-страница с названием МЕНЮ

Нажимаем “Наполнить содержанием”. И мы попадаем в редактор страницы.

Редактор страницы имеет два режима:
– Визуальный режим
– Режим wiki-разметки

Если треугольные скобки обрамлены в синий квадрат, то значит включен режим вики-разметки.

режим вики-разметки

Если скобки синие без рамки, то вы в визуальном редакторе.

Нам нужен редактор вики-разметки. Тут мы будем прописывать код для меню в вк.

Но перед написанием кода, посмотрите в адресную строку.
Скопируйте все символы до знака вопроса (?) – это адрес вашего меню.
Запишите его!

Меню для группы ВК

С начала его нужно сделать (в графическом редакторе).

Размер меню такой:
– ширина максимум 600 px (так удобнее всего)
– высота как получится.

Я сделал такое меню:

картинка меню группы вк

Теперь в фотошопе (инструментом “Раскройка”) я разрезаю меню на равные части.

весь макет режим на равные части

Там же в фотошопе нажимаем Файл → Сохранить для Web…

Выделяю все части и сохраняю в формате Png-24.

В итоге у меня получилось 12 частей.

Вики-разметка не предусмотрена для правильного отображения в мобильных приложениях. Поэтому всегда режьте меню на равные части или делайте меню в один столбец. Тогда ваше меню будет выглядеть одинаково на ПК и в приложениях.

Теперь все получившиеся куски надо загрузить в альбом группы.

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

Возвращаемся на созданную страницу МЕНЮ. Если забыли она находится по этому адресу http://vk.com/pages?oid=-123456789&p=МЕНЮ
Не забываем 123456789 заменить на номер вашей группы.

Что-бы вновь перейти к режиму редактирования – нужно нажать значок Карандаша в верхнем углу.

Нажми для редактирования

Теперь нам нужно построить таблицу из нашей нарезки в которой картинки будут кнопками-ссылками, а те места где нет кнопки будут не кликабельны.

Таблица в ВК начинается так: {|
а заканчивается так:|}

Меню всегда делайте таблицей, что-бы кнопки не скакали когда смотришь группу через приложение

В общем пишем так (но со своими значениями):

{|noborder;nopadding
|-
| [[photo-176307581_456239020|300x100px;nopadding;nolink| ]]
| [[photo-176307581_456239021|300x100px;nopadding;nolink| ]]
|-
| [[photo-176307581_456239022|300x100px;nopadding|https://vk. com/topic-176307581_39164350]]
| [[photo-176307581_456239023|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
|-
| [[photo-176307581_456239024|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
| [[photo-176307581_456239025|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
|-
| [[photo-176307581_456239026|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
| [[photo-176307581_456239027|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
|-
| [[photo-176307581_456239028|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
| [[photo-176307581_456239029|300x100px;nopadding|https://vk.com/topic-176307581_39164350]]
|-
| [[photo-176307581_456239030|300x100px;nopadding;nolink| ]]
| [[photo-176307581_456239031|300x100px;nopadding;nolink| ]]
|}

Вместо photo-176307581_456239020 и подобных – заменяем на номера своих картинок.

Узнать их можно так:

  1. Переходим в альбом группы “Технический”
  2. Открываем первое фото куска меню
  3. В адресной строке копируем часть с номером этой картинки (там много цифр, перед нужной нам написано photo-)
адрес картинки для меню в vk

И так проделываем с каждой картинкой нашего меню для группы ВКонтакте.

А вместо https://vk.com/topic-176307581_39164350 пишем ссылку на нужную нам страницу.
Эти страницы я обычно создаю как Обсуждения (для этого их нужно активировать через настройки Управления)

Так проделываем с каждой кнопкой.

У тех картинок которые не являются кнопкой стоит значение [[photo-176307581_456239030|300x100px;nopadding;

nolink| ]]. При нажатии на такую картинку – ничего не произойдет.

В любой момент редактирования вы можете посмотреть что у вас получается. Для этого кликните по вкладке Просмотр.

Просмотр покажет ваш текущий результат

Кнопка меню вк

Подготавливаем картинку с надписью “Открыть меню” или просто “Меню”.

Это будет кнопка вызова меню группы.

Размер кнопки Меню:
– Ширина 600 px
– Высоту желательно делать меньше или такую же.

Вот моя кнопка вызова меню

Теперь переходим в нашу группу и создаём Новую запись.

В качестве фотографии выбираем нашу картинку-кнопку.

А в названии вставляем адрес с нашим Меню (тот который надо было записать). Вы увидите, что после картинки (ниже) появится надпись МЕНЮ. Теперь просто стираете название-ссылку.

И нажмите на Шестеренку и добавьте галочки “От имени сообщества” (что-бы можно было закрепить запись) и галочку “Выключить комментарии”

Настройка кнопки вызова меню

Теперь нажимая на эту картинку – будет открываться наше меню в вк.

Не забудьте закрепить эту запись, что-бы Меню всегда было вверху ленты постов.

Вот и всё. Теперь у вас получилось не только создать меню для сообщества ВКонтакте, а даже полностью оформить его.

Обязательно добавьте статью в закладки. Я так сделал) Не раз ещё пригодится.

И подписывайтесь на новые и только полезные статьи!

Если вам понравилось как я оформляю группу вк, то заказывайте оформление у меня (стоимость услуг)

Шутка дня:
Экипаж прощается с вами и желает Вам приятного полета.

Как сделать, чтобы в группе «ВКонтакте» было живое общение?

Вы завели группу, сделали альбомы, написали продающие тексты — вроде бы все хорошо, но в группе царит гробовое молчание. Подписчики изредка ставят лайки, но почему-то не комментируют. И руки уже опасаются писать очередной пост: а вдруг они вообще не читают? Вдруг неинтересно? Почему никто даже словечка не скажет?

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

 


  Как продвигать бизнес ВКонтакте? Полный мануал: от создания сообщества до аналитики.


 

Под коммуникативным контентом я понимаю контент, который стимулирует пользователей общаться. Это могут быть посты, усиливающие коммуникацию на «стене» группы (в комментариях) или предлагающие подписчикам перейти для общения в раздел «Обсуждения». Во втором случае на «стене» задается тема и дается ссылка на «топик». Главной  целью такого вида контента является создание вокруг вашей компании устойчивого «живого» сообщества.

Проще говоря — тусовки, где все друг друга знают и куда постоянно возвращаются.

Для использования коммуникативного контента могу дать  вам один совет: обязательно участвуйте во всех дискуссиях и отвечайте на большую часть комментариев. Тогда общение будет оживленнее. Для дальнейшего расширения обсуждений можно использовать следующий прием: создать несколько аккаунтов (или нанять несколько сотрудников), которые будут регулярно отвечать на реплики подписчиков и «подливать масла в огонь». Только не указывайте их в контактах группы, иначе люди поймут, что это администраторы, а не такие же участники, как и они.

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

Нужно понимать, что чем острее проблема, тем оживленнее  и продолжительнее будет дискуссия. В некоторых ситуациях,  даже в маленькой группе (1000–2000 человек) можно получить сотни комментариев. Главное — попасть в «болевую» точку. Например, в детской тематике обсудить прививки  и антибиотики: стоит их делать и принимать или нет?

Как я говорил ранее, оптимальный вариант — искать темы на профильных форумах, в обсуждениях других групп или с помощью сервиса wordstat.yandex.ru

Можно обсуждать (узнавать мнение участников сообщества) не только «болевые» точки, но и новости, последние тренды отрасли. Если бы вашей тематикой был интернет-маркетинг, подошло бы, например, влияние мобильных технологий на  продвижение и зарождающийся рынок мобильной рекламы.

Необязательно жестко привязываться к своей тематике. Вокруг постоянно что-то происходит. Многие события затрагивают и волнуют людей из самых разных отраслей. Соответственно, эти темы можно обсуждать. Что вы думаете о «выпиливании» пиратских аудиозаписей в ВКонтакте? Вас возмутил закон об оскорблении чувств верующих? Почему такая шумиха вокруг развода Путина? Вы против усыновления наших детей американцами?

В нашей стране каждую неделю что-то случается. Зайдите на любой новостной сайт (например, «Эхо Москвы») и посмотрите самые обсуждаемые темы. Социально-политические вопросы, как правило, очень дискуссионные. Спрашивайте мнение вашей аудитории, люди обязательно выскажутся. Только обязательно следите за комментариями и старайтесь удалять прямые оскорбления, чтобы общение не превратилось в ругань. При обсуждении «горячих» тем такое часто случается.

Этот прием позволяет укрепить горизонтальные связи подписчиков. В данном случае они общаются между собой, а вы являетесь модератором дискуссии: задаете тему или просто приглашаете к общению. Обычно такие чаты запускают ближе к ночи (поэтому они и называются ночными). Именно в такое время большинство людей закончили все свои дела и готовы к общению.Чем моложе аудитория, тем лучше она реагирует. Многие используют такие чаты для личных знакомств. Взрослая аудитория вступает в подобные дискуссии гораздо реже.

Использовать этот прием советую, если численность вашей группы превышает 10 000 «живых» участников. Если меньше, чат обычно быстро «умирает». Еще советую задавать тему. У нее есть главная функция — начать общение и повернуть ее в некое русло. Затем участники действуют сами и часто далеко уходят от заданной темы. Очень хорошо работает тема отношений, она всегда популярна. Например: «Как вы относитесь к мужским изменам?».

Отрывок из книги «Продвижение бизнеса ВКонтакте. Быстро и с минимальными затратами»

Ну что, кто что думает о санкциях и курсе валют?:) 


  Ваша группа не растет? Все, что вам нужно знать о раскрутке сообщества ВКонтакте — позиционирование, контент-стратегия, вовлечение, аналитика и таргетированная реклама — вы найдете в видеокурсе “Как продвигать бизнес ВКонтакте?”


 

Понравилась статья? Поделись с друзьями!

Блог Khronos — The Khronos Group Inc

Введение

Khronos представила новое расширение под названием VK_EXT_graphics_pipeline_library, которое позволяет компилировать шейдеры намного раньше, чем при полном времени создания Pipeline State Object (PSO). Используя это расширение, я смог избежать многих причин зависаний кадров из-за позднего создания PSO во время отрисовки в средстве визуализации Source 2 Vulkan. Спецификация расширения была выпущена сегодня, и вскоре последует поддержка SDK, вы можете отслеживать статус выпуска на https://github.com/KhronosGroup/Vulkan-Docs/issues/1808.

Движок Source 2 в значительной степени был разработан на основе модели Direct3D11, в которой шейдеры создаются независимо, а объекты состояния предоставляются во время отрисовки. Таким образом, существует значительное количество информации, которую наш движок не знает в то время, когда шейдеры предоставляются нашей абстракции рендеринга: спаривание шейдеров на разных этапах, форматы вершин, форматы кадрового буфера, состояние глубины/стенсила, информация об области просмотра, состояние MSAA. , и ряд других. Это означает, что мы откладываем создание PSO до времени отрисовки, что может привести к задержкам, особенно при холодном кеше конвейера.

Прежде чем подробно рассказать о том, как мы интегрировали VK_EXT_graphics_pipeline_library в наш движок, я хочу сделать пару предостережений по поводу этого расширения. Прежде всего следует сказать, что есть очень веская причина, по которой Vulkan был разработан таким образом, чтобы работа по компиляции шейдеров происходила во время создания PSO с полным просмотром всего требуемого состояния. В то время как драйверы Direct3D11 создают иллюзию полной компиляции только с байтовым кодом шейдера, правда в том, что внутри драйверов происходят огромные героические усилия, чтобы сделать это так. Драйверы часто выполняют фоновую компиляцию в нескольких потоках, и на самом деле Direct3D11 не может гарантировать, что компиляция шейдера не произойдет во время отрисовки. Однако на практике поставщики графических процессоров исключительно хорошо справились с этой героической задачей, и типичный пользовательский опыт с драйвером Direct3D11 приводит к значительно меньшим задержкам, чем наш модуль рендеринга Vulkan без полностью предварительно прогретых конвейерных кешей. Тем не менее, приложения Vulkan, которые могут заранее знать все состояния шейдеров и конвейеров, гарантированно избегают задержек, поскольку работа по компиляции шейдеров будет полностью выполняться во время создания PSO. В то время как с Direct3D11 такой гарантии нет.

Второе предостережение заключается в том, что если вы разрабатываете новый движок для Vulkan, вам действительно следует подумать, является ли хорошей идеей иметь большое количество перестановок шейдеров. Некоторые игры, такие как DOOM 2016/DOOM Eternal, сохранили очень небольшое количество PSO. Подробное описание этого пространства проектирования выходит за рамки этого поста в блоге, но я настоятельно рекомендую прочитать эту серию блогов из двух частей, в которой объясняется, почему многие движки имеют большое количество перестановок шейдеров (что является одной из основных причин многих задержек при компиляции во время отрисовки). ): Проблема перестановки шейдеров: как мы к этому пришли?

Учитывая все вышесказанное, Khronos слышал от многих разработчиков (включая нас), что в некоторых сценариях просто невозможно заранее знать все состояние PSO. Частично это привело к созданию нескольких новых расширений (ядро в Vulkan 1. 3), которые позволяют сделать гораздо больше динамических состояний PSO. VK_EXT_graphics_pipeline_library делает еще один шаг вперед, позволяя полностью свести шейдеры к машинным инструкциям задолго до начала отрисовки. Благодаря этому расширению движки в стиле Direct3D11, такие как наш, могут обеспечить сравнимые (или даже лучшие!) возможности с компиляцией шейдеров по сравнению с Direct3D11. В следующих разделах я представлю обзор VK_EXT_graphics_pipeline_library и подробно опишу процесс интеграции расширения в движок Source 2.

Обзор библиотеки графических конвейеров

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

  • Vertex Input Interface
  • Шейдеры перед растеризацией
  • Фрагментный шейдер
  • Интерфейс вывода фрагментов

Интерфейс ввода вершин содержит информацию, которая обычно предоставляется объекту состояния полного конвейера с помощью VkPipelineVertexInputStateCreateInfo и VkPipelineInputAssemblyStateCreateInfo. Для нашего движка эта информация неизвестна до момента отрисовки, поэтому конвейер для этого этапа по-прежнему хэшируется и создается во время отрисовки. Однако этот этап не имеет шейдерного кода и поэтому драйвер может его быстро создать, да и этих объектов тоже довольно мало.

Шейдеры перед растеризацией содержат этапы вершинного, мозаичного и геометрического шейдера вместе с состоянием, связанным с VkPipelineViewportStateCreateInfo, VkPipelineRasterizationStateCreateInfo, VkPipelineTessellationStateCreateInfo и VkRenderPass (или динамической отрисовкой). Это может звучать как больше информации, чем ваш движок мог бы знать во время создания шейдера, это определенно было для нас. Однако ключевой момент заключается в том, что при объединении конвейерных библиотек с расширениями динамического состояния единственной информацией, которая действительно необходима для создания шейдера до растеризации, является код SPIR-V и схема конвейера. Это обсуждается более подробно ниже.

Этап фрагментного шейдера содержит фрагментный шейдер вместе с состоянием в VkPipelineDepthStencilStateCreateInfo и VkRenderPass (или динамическом рендеринге — хотя в этом случае требуется только viewMask). Как и на этапе предварительной растеризации, в сочетании с динамическим рендерингом вы можете создать конвейер фрагментного шейдера, используя только SPIR-V и макет конвейера. Это позволяет драйверу выполнять тяжелую работу по снижению аппаратных инструкций для предварительной растеризации и фрагментных шейдеров с очень небольшим количеством информации.

Наконец, есть интерфейс вывода фрагментов, который содержит VkPipelineColorBlendStateCreateInfo, VkPipelineMultisampleStateCreateInfo и VkRenderPass (или динамического рендеринга). Как и в случае интерфейса ввода вершин, на этом этапе требуется информация, которую мы не знаем до момента отрисовки, поэтому это состояние также хешируется, и конвейер интерфейса вывода фрагментов создается во время отрисовки. Ожидается, что он будет создан очень быстро, а также будет относительно небольшим по количеству.

После создания всех четырех отдельных этапов библиотеки конвейера приложение может выполнить окончательную связь с полным конвейером. Ожидается, что эта последняя ссылка будет очень быстрой — драйвер сделает компиляцию шейдера для отдельных этапов, и поэтому связь может быть выполнена во время отрисовки по разумной цене. Именно здесь проявляется большое преимущество расширения: мы заранее создали все наши прерастровые и фрагментные шейдеры, хешировали небольшое количество входных/выходных интерфейсов вершин и можем по запросу создать быстрый связанный конвейер. библиотеку во время отрисовки, что позволяет избежать ужасной заминки.

Ранняя компиляция шейдеров с конвейерными библиотеками

В нашем движке шейдеры предоставляются нашему уровню абстракции рендеринга во время загрузки наших материалов (что происходит во время запуска или экранов загрузки). В Direct3D11 это напрямую приводит к вызову методов IDirect3D11Device::Create*Shader. В Vulkan, до VK_EXT_graphics_pipeline_library, единственное, что мы могли сделать в то время, это vkCreateShaderModule. Это передает SPIR-V драйверу, но на самом деле не запускает какую-либо значительную компиляцию шейдера, поскольку драйвер Vulkan должен сделать это во время создания PSO, когда известны все этапы шейдера, макеты наборов дескрипторов и требуемое состояние.

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

Динамическое состояние

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

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

  • VK_EXT_extended_dynamic_state
  • ВК_EXT_extended_dynamic_state2
  • ВК_ХР_динамический_рендеринг

К счастью, все эти три расширения являются частью Vulkan 1.3, поэтому можно ожидать, что они будут поддерживаться везде, где поддерживается VK_EXT_graphics_pipeline_library.

Для вершинного шейдера (конвейерная библиотека перед растеризацией) информация в следующей таблице должна быть динамической, чтобы мы могли немедленно создать конвейерную библиотеку. То есть мы не знаем область просмотра, смещение глубины, режим отбраковки, цели рендеринга (или форматы) в то время, когда нам предоставляется вершинный шейдер, поэтому, сделав все это состояние динамическим, мы можем создать конвейерную библиотеку до растеризации. только с SPIR-V (и схемой конвейера, подробнее об этом позже).

Динамическое состояние этапа перед растеризацией

Состояние Динамическое состояние
VkPipelineViewportStateCreateInfo VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT
VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT
VkPipelineRasterizationStateCreateInfo VK_DYNAMIC_STATE_DEPTH_BIAS
VK_DYNAMIC_STATE_CULL_MODE_EXT
VK_DYNAMIC_STATE_FRONT_FACE_EXT
VkRenderPass Динамический (VK_NULL_HANDLE) с VK_KHR_dynamic_rendering

Как и в случае с вершинным шейдером, для фрагментного шейдера существует множество состояний, о которых мы не знаем во время загрузки SPIR-V. В частности, мы не знаем состояния глубины/трафарета и рендерпасса, поэтому делаем их динамическими, как описано в следующей таблице.

Динамическое состояние этапа фрагмента

Состояние Динамическое состояние
VkPipelineDepthStencilStateCreateInfo VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK
VK_DYNAMIC_STATE_STENCIL_WRITE_MASK
VK_DYNAMIC_STATE_STENCIL_REFERENCE
VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT
VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT
VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT
VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT
VK_DYNAMIC_STATE_STENCIL_OP_EXT
VK_DYNAMIC_STATE_DEPTH_BOUNDS
VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT
VkRenderPass Динамический (VK_NULL_HANDLE) с VK_KHR_dynamic_rendering

Макеты конвейеров

С динамическими состояниями, использованными в предыдущем разделе, единственная дополнительная информация, которая нам нужна для создания библиотек конвейеров вершинных/фрагментных шейдеров, — это макет конвейера. На первый взгляд может показаться, что это довольно простая информация для сбора. Из отражения шейдера мы знаем, какие дескрипторы используются в шейдере, поэтому мы должны знать макеты наборов дескрипторов для каждого этапа. Это было бы очень просто, если бы вершинный и фрагментный шейдеры создавались вместе в паре, но это работает иначе (и я не представляю, сколько движков на базе Direct3D11 работает). Хотя оба наших шейдера содержатся в одном и том же файле, до момента отрисовки не известно, какая пара вершинных/фрагментных шейдеров будет использоваться вместе. Например, в проходе только по глубине вершинный шейдер A связан с фрагментным шейдером A (т. е. который извлекает текстуру для выполнения альфа-теста). В прямом проходе вершинный шейдер A будет соединен с фрагментным шейдером B, который выполняет полное прямое освещение. И на самом деле есть много других сценариев, где точная комбинация не известна до момента розыгрыша.

Это создает проблему для библиотеки VK_EXT_graphics_pipeline_library, которой требуется полный макет конвейера, когда мы создаем этап предварительной растеризации или фрагментного шейдера. У нас просто нет этой информации — мы знаем дескрипторы, потребляемые этапом, который мы компилируем, но не другим этапом. К счастью, VK_EXT_graphics_pipeline_library содержит флаг, который позволяет вам создать макет конвейера, в котором каждому этапу нужны только используемые им наборы дескрипторов (VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_KHR). Пока макеты наборов дескрипторов совпадают с любыми общими наборами дескрипторов, мы можем не предоставлять другие макеты наборов дескрипторов этапа во время создания отдельных библиотек этапов.

Один из простых способов справиться с этим — использовать разные наборы дескрипторов для каждого этапа шейдера. Вы просто предоставляете схему конвейера, содержащую наборы дескрипторов для каждого этапа, для каждой библиотеки. Наше ядро, однако, этого не делает. Причина, по которой мы этого не делаем, частично связана с производительностью (чтобы мы могли выделить/обновить/связать один набор дескрипторов для динамических ресурсов в VS/FS вместо двух) и частично из-за того, что некоторые реализации Vulkan все еще имеют очень маленькую общее количество поддерживаемых наборов дескрипторов (в частности, некоторые мобильные графические процессоры имеют ограничение в 4).

Наборы дескрипторов разделов нашего движка примерно следующие:

  • Набор дескрипторов 0 — динамические ресурсы не привязаны до времени отрисовки для всех этапов
  • Набор дескрипторов 1 — статические дескрипторы вершинного шейдера
  • Набор дескрипторов 2 — статические дескрипторы фрагментного шейдера
  • Набор дескрипторов 3 — дескрипторы без привязки (общие для всех этапов)

Таким образом, для библиотек графических конвейеров мы создаем макеты конвейеров следующим образом:

  • Набор дескрипторов 0 — «убер-набор», который содержит все возможные потребляемые динамически связанные ресурсы, которые могут совместно использоваться в VS/FS
  • .
  • Набор дескрипторов 1 — предоставляется только библиотеке предварительной растеризации (вершинному шейдеру), если она используется
  • Набор дескрипторов 2 — предоставляется только для библиотеки фрагментных шейдеров, если она используется
  • Набор дескрипторов 3 — предоставляется для обоих этапов, если используется

Другими словами, библиотека вершинных шейдеров создается с конвейерной компоновкой, содержащей наборы дескрипторов 0, 1 и 3. Библиотека фрагментных шейдеров создается с конвейерной компоновкой, содержащей наборы дескрипторов 0, 2 и 3. Мы знаем, что наборы 1, 2 и 3 будут иметь идентичные макеты на всех используемых этапах, и мы также гарантировали это для набора дескрипторов 0, сделав его «убер-набором», содержащим все возможные потребляемые ресурсы.

И последнее замечание: схема конвейера должна также содержать неизменяемые сэмплеры и константы push. Для нас push-константа является общим ресурсом для разных стадий, поэтому у нас есть информация, чтобы применить ее к обеим стадиям шейдера при создании макетов для каждой стадии (она уже не может различаться между стадиями из-за того, как мы ее используем). Точно так же неизменяемое состояние сэмплера известно заранее, поэтому мы можем включить его в макет конвейера.

Интерфейс ввода вершин и интерфейс вывода фрагментов

Используя то, что я описал до сих пор, мы теперь можем сразу скомпилировать наши вершинные и фрагментные шейдеры, используя только SPIR-V и компоновку конвейера. Нам нужно построить еще два этапа: входной интерфейс вершины и выходной интерфейс фрагмента. Эти биты информации все еще неизвестны до момента отрисовки, поэтому мы хешируем подмножество информации, необходимой для интерфейса ввода вершины и интерфейса вывода фрагмента. Эти этапы должны быть небольшими по количеству (я измерил менее сорока в рабочей нагрузке нашего движка), а также быстро создаваться. В отличие от других этапов, для компиляции драйвера не требуется кода шейдера.

Окончательный связанный конвейер

Когда все четыре этапа готовы, мы можем создать окончательную библиотеку связанного конвейера непосредственно перед рисованием с использованием нового материала. Есть некоторые решения, которые необходимо принять при создании окончательного связанного конвейера, которые потенциально обменивают быстрое время соединения на ЦП на снижение производительности графического процессора. То есть, если вы создали отдельные библиотеки конвейеров с помощью VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT, вы можете выбрать, хотите ли вы, чтобы драйвер создавал окончательный связанный конвейер с межэтапной оптимизацией. Ожидается, что выполнение кросс-стадийной оптимизации увеличит время ЦП за счет повышения производительности графического процессора.

Наша цель — добиться отсутствия задержек во время отрисовки, поэтому мы изначально создаем наши связанные библиотеки без набора VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT. Ожидается, что без установки этого бита создание связанной конвейерной библиотеки в драйвере будет происходить очень быстро. Это будет особенно быстро в реализациях, которые устанавливают VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT.graphicsPipelineLibraryFastLinking (что верно, по крайней мере, для всех поставщиков настольных компьютеров — NVIDIA, AMD и Intel). Ожидается, что даже в тех реализациях, которые не задают GraphicsPipelineLibraryFastLinking, связывание библиотеки конвейера будет значительно быстрее, чем полное соединение PSO.

После создания конвейерной библиотеки с быстрым связыванием без оптимизации мы запускаем компиляцию конвейерной библиотеки с VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT в фоновом потоке и подкачиваем ее, когда она будет готова. Таким образом, мы избегаем заминок при первом создании конвейерной библиотеки, но можем восстановить полную производительность графического процессора, как только у нас будет время выполнить кросс-стадийную оптимизацию в фоновом режиме. Этот выбор полностью зависит от приложения: некоторые приложения, менее чувствительные к заиканиям, могут всегда создавать конвейерную библиотеку, связанную с несколькими этапами. Они по-прежнему должны ожидать значительного улучшения ЦП по сравнению с созданием полного PSO, поскольку большая часть компиляции будет перемещена раньше.

Заключение

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

Спасибо

Спасибо всем участникам Khronos, которые участвовали в создании этого расширения, особенно Крису Гловеру из Google за его руководство. Я также хотел бы особо поблагодарить Тобиаса Гектора из AMD за защиту этого расширения и Пирса Даниэля из NVIDIA за раннюю поддержку драйверов. Спасибо Baldur Karlsson за раннюю поддержку RenderDoc для помощи в разработке и Nathaniel Cesario @ LunarG за поддержку проверки. Также спасибо Mike Blumenkrantz @ Valve за раннюю поддержку в lavapipe.

Обсуждения

В обсуждениях вы можете поделиться мыслями и идеями о материалах занятий. В Blackboard Learn участники курса могут проводить вдумчивые обсуждения, как в традиционном классе, но с преимуществами асинхронного общения. Участникам не обязательно находиться в одном месте или в одном часовом поясе, и вы можете тщательно обдумать свои ответы.

Вы можете использовать обсуждения для следующих задач:

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

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

 


Открыть обсуждение

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

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

Дополнительные сведения о групповых обсуждениях

Если преподаватель добавил сроки выполнения оцениваемых обсуждений, вы можете открывать обсуждения на страницах оценок, в календаре и в ленте активности.

В курсе выберите значок «Обсуждения» на панели навигации вашего курса. Выберите обсуждение из появившегося списка. Обсуждения также могут отображаться вместе с другими материалами курса на странице «Материалы курса».

Обсуждения в представлении курса Ultra не используют форумы и темы.

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

Подробнее о создании ответов и ответов

Над списком участников в разделе «Автор» вы можете увидеть, кто создал обсуждение.


Опубликовать ответ первым

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

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


Создать обсуждение

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

Подробнее об удалении ваших обсуждений, ответов и ответов

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

  1. В своем курсе выберите значок «Обсуждения» на панели навигации.
  2. Нажмите значок плюса в правом верхнем углу, чтобы открыть меню. Если знак «плюс» не отображается, вам не разрешено создавать обсуждения.
  3. В меню выберите Добавить обсуждение. Ваше обсуждение появится вверху списка. Только ваш преподаватель может переместить его в список или добавить в папку.
  4. На странице «Новое обсуждение» введите осмысленный заголовок. Тщательно выбирайте название обсуждения. После того, как вы переместите курсор за пределы строки заголовка, заголовок обсуждения сохранится. Только ваш преподаватель может редактировать заголовок.
  5. Начните обсуждение с вопроса, идеи или ответа. Вы можете использовать параметры редактора для форматирования текста, прикрепления файлов и встраивания мультимедиа. Если вы просматриваете редактор на меньшем экране, выберите значок «плюс», чтобы просмотреть меню параметров. Например, выберите «Вставить/редактировать локальные файлы», представленный значком скрепки. Найдите файл на своем компьютере. Появится окно состояния, показывающее ход загрузки файла.

    Чтобы использовать клавиатуру для перехода к панели инструментов редактора, нажмите ALT + F10.