background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial"

input logo icon
Теги видео
|

Теги видео

gamedev
game development
development
unity
unity3d
madewithunity
programming
game design
csharp
nedmakesgames
nedmakesgames dev log
indiedev
indie game
dev log
shaders
3d modeling
blender
tutorial
walkthrough
shader
universal render pipeline
urp
unitytip
unitytips
compute shader
compute
mesh
asset
save
saving
editor
editor script
script
hlsl
inspector
custom inspector
scriptableobject
procedural
procedural generation
gpu
graphicsbuffer
computebuffer
buffer
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:00
Привет, я Нед, и сегодня я делаю игры. У меня есть
00:00:02
для вас интересное руководство по Unity,
00:00:04
как создать и сохранить ресурс сетки с помощью
00:00:07
вычислительного шейдера.
00:00:08
Вычислительные шейдеры — это специальные программы,
00:00:10
которые запускаются на графическом процессоре
00:00:12
и специализируются на проблемах, которые
00:00:13
можно разобрать на несколько более мелких
00:00:15
частей,
00:00:16
если это описывает вашу сетку, вычислительный
00:00:19
шейдер идеально подходит для ее очень быстрого построения,
00:00:22
в процессе мы научимся настраивать
00:00:24
и отправлять вычислительный шейдер из
00:00:25
редактора,
00:00:26
получать данные из графического процессора, создавать
00:00:29
и сохранять
00:00:30
сетку У меня есть вводное
00:00:33
видео о вычислительных шейдерах, которое вы, возможно, захотите
00:00:34
посмотреть.
00:00:37
В этом видео я объясню основы вычислительных шейдеров,
00:00:39
но может быть полезно посмотреть на него под
00:00:40
другим углом.
00:00:42
Вам также следует знать, как сетка
00:00:43
описывается с помощью вершины. и массив индексов,
00:00:46
а также простой синтаксис кода hlsl,
00:00:50
прежде чем мы начнем. Я хочу поблагодарить
00:00:51
всех вас за просмотр.
00:00:53
Если вы новичок, я создаю еженедельные
00:00:54
руководства по разработке игр, поэтому,
00:00:56
пожалуйста, рассмотрите возможность подписки и включения
00:00:58
уведомлений о колокольчиках, а
00:01:00
также посетите наш сервер Discord сообщества,
00:01:02
это отлично подходит для помощи в разработке,
00:01:04
в описании видео есть ссылка,
00:01:06
давайте начнем.
00:01:12
В этом проекте я использовал Unity 2020.2.2 f1 и универсальный конвейер рендеринга 10.2.2,
00:01:15
однако код должен работать
00:01:17
при использовании любого средства рендеринга,
00:01:19
если вы используете более новую версию. версия Unity
00:01:21
проверьте описание видео на наличие
00:01:23
исправлений,
00:01:25
таких как мое предыдущее видео, мы будем использовать
00:01:27
вычислительный шейдер для построения маленьких пирамид
00:01:29
на каждом треугольнике сетки.
00:01:31
Это не очень полезный эффект, но мы
00:01:33
можем многому научиться из него,
00:01:35
сначала настройте свой проект использовать
00:01:37
универсальный конвейер рендеринга или любой другой
00:01:38
рендерер,
00:01:41
теперь мы будем работать со скриптами редактора,
00:01:43
чтобы сообщить Unity, что эти скрипты
00:01:45
не следует включать в сборки игры,
00:01:48
создайте папку с именем editor,
00:01:50
любой код внутри теперь является редактором,
00:01:53
создайте скрипт c-sharp называемые
00:01:55
настройками запекания пирамиды,
00:01:57
мы будем использовать их для определения актива, который
00:01:58
будет содержать настройки генерации,
00:02:01
сначала он должен наследовать класс
00:02:04
от объекта сценария,
00:02:05
а не моно, если вы никогда не работали
00:02:08
с ними до того, как
00:02:09
класс объекта сценария позволит нам
00:02:11
настроить наш собственные пользовательские типы активов.
00:02:14
Добавьте атрибут меню создания актива. Это
00:02:17
упрощает создание нового актива
00:02:19
этого типа с помощью раскрывающегося меню создания Unity.
00:02:23
Аргумент имени файла определяет
00:02:25
имя файла по умолчанию для нового актива,
00:02:27
а имя меню определяет, где находится эта
00:02:29
опция. появится в меню единства.
00:02:31
Вы даже можете определить подменю, используя
00:02:33
косую черту,
00:02:36
прежде чем вернуться к единству. Добавьте несколько
00:02:38
общедоступных свойств,
00:02:40
включая исходную сетку и
00:02:42
индекс исходной подсетки,
00:02:43
чтобы определить сетку, которую мы построим
00:02:45
поверх масштаба и вращения
00:02:48
для применения. в сетку, прежде чем добавлять
00:02:49
пирамиды,
00:02:51
а также высоту пирамиды
00:02:54
обратно в единстве. Создайте новый ресурс настроек запекания пирамиды,
00:02:58
используя новый пункт меню. Хорошо, это
00:03:01
здорово, но теперь нам нужен сценарий для чтения этих
00:03:03
данных и построения сетки,
00:03:05
давайте создадим собственный инспектор, поэтому мы
00:03:07
можем добавить кнопку, чтобы сделать это
00:03:09
в папке вашего редактора. Создайте новый
00:03:11
сценарий c Sharp под названием «Инспектор запекания пирамиды», который
00:03:15
этот класс должен наследовать от редактора,
00:03:18
сигнализируя о нем как о пользовательском инспекторе для
00:03:20
некоторого класса.
00:03:21
Скажите Unity, что это должен быть
00:03:23
инспектор настроек запекания пирамиды.
00:03:25
с помощью этого пользовательского атрибута инспектора
00:03:28
теперь переопределяется метод графического интерфейса инспектора
00:03:32
и вызывается базовый метод. Это рисует
00:03:34
инспектор по умолчанию,
00:03:36
поэтому мы все еще можем редактировать свойства актива
00:03:39
сейчас, чтобы добавить
00:03:41
вызов кнопки guilayout.button, передавая строку метки,
00:03:45
функция возвращает true, если это было
00:03:46
нажал это обновление,
00:03:48
добавил журнал отладки, а затем вернулся в Unity,
00:03:53
выбрал свой ресурс, и есть кнопка,
00:03:56
нажав на нее, вы распечатаете наше отладочное
00:03:58
сообщение, чтобы двигаться дальше. Я думаю, что
00:04:00
проще всего написать вычислительный шейдер следующим образом, чтобы мы
00:04:03
могли четко видеть, что ему
00:04:04
нужно. запустите,
00:04:06
создайте вычислительный шейдер, называемый
00:04:08
построителем пирамиды, и откройте его,
00:04:11
как графические шейдеры, вычислительные шейдеры
00:04:13
написаны на hlsl.
00:04:15
Эта строка ядра хеш-прагмы определяет
00:04:17
функцию, которую мы можем вызвать из c
00:04:19
Sharp, давайте назовем нашу функцию main, а затем определим
00:04:22
ее следующим образом:
00:04:24
атрибут num threads сообщает
00:04:25
компилятор, сколько независимых потоков должно
00:04:28
создаваться одновременно,
00:04:29
вы можете определить это в трех измерениях,
00:04:31
что полезно при работе с
00:04:33
текстурами, но мы можем просто использовать
00:04:35
измерение x, цифры здесь могут потребовать некоторой
00:04:37
тонкой настройки, чтобы найти лучший размер,
00:04:39
но давайте начнем с 128 вызовом этого
00:04:43
ядра из процессора называется
00:04:44
диспетчеризацией.
00:04:46
Когда вы отправляете, вы сообщаете графическому процессору,
00:04:48
сколько групп потоков нужно создать,
00:04:50
например, если вы отправляете 10 групп,
00:04:53
main будет запускаться 120 раз по 10 или 1280 раз
00:04:59
аргумент main, отмеченный
00:05:01
подчеркиванием sv Семантика идентификатора потока диспетчеризации
00:05:03
содержит уникальный идентификатор среди всех вызовов
00:05:05
этой функции. Этот факт мы можем использовать для
00:05:08
работы с уникальным треугольником
00:05:09
при каждом вызове. Давайте сделаем небольшую резервную копию и
00:05:12
определим несколько структур данных, которые
00:05:14
мы будем использовать в буферах данных или фрагментах данных.
00:05:16
доступ к памяти, такой как массивы,
00:05:18
для чтения входных данных и записи выходных данных,
00:05:21
процессор также может загружать данные в эти
00:05:23
буферы,
00:05:24
поскольку мы работаем с сетками, нам
00:05:26
понадобится буфер вершин и буфер индексов,
00:05:29
где каждые три записи в
00:05:30
буфере индексов содержат идентификаторы вершин которые
00:05:33
вместе образуют треугольник, мы выведем
00:05:36
сетку таким же образом,
00:05:37
но обратите внимание, что эти буферы имеют
00:05:38
префикс rw, что
00:05:40
означает, что мы также можем писать в них.
00:05:42
Теперь определите структуры данных вершин.
00:05:45
Входные вершины будут иметь позицию и
00:05:47
uv, а выходные вершины будут также
00:05:49
содержит нормаль,
00:05:51
наконец, мы установим несколько других переменных
00:05:53
в вычислительном шейдере,
00:05:54
количество треугольников в исходной
00:05:56
сетке, высоту пирамиды
00:05:58
и матрицу преобразования,
00:06:01
возврат к основной функции, мы хотим, чтобы она
00:06:03
запускалась один раз для каждого треугольника в исходной
00:06:05
сетке,
00:06:06
поэтому если идентификатор диспетчеризации больше, чем
00:06:08
количество треугольников,
00:06:09
вернитесь теперь, получите точки нашего рабочего
00:06:12
треугольника,
00:06:13
вычислите начальный индекс в
00:06:15
буфер индекса, умножив идентификатор диспетчеризации
00:06:17
на 3. возьмите три угловые вершины
00:06:21
из буферов
00:06:22
и затем подайте их в эта
00:06:23
функция преобразования, что делает преобразование,
00:06:26
мы можем написать это выше, она применяет
00:06:28
свойство преобразования к положению вершины,
00:06:30
позволяя нам масштабировать и вращать
00:06:32
исходную сетку, прежде чем строить из нее
00:06:35
теперь, когда у нас есть углы треугольника,
00:06:37
давайте сначала вычислим точку пирамиды,
00:06:39
вычислим нормальный вектор
00:06:42
плоскости, содержащей этот треугольник,
00:06:44
я инкапсулирую его в эту функцию, мы
00:06:46
можем найти его, взяв векторное
00:06:48
произведение двух линий, образованных
00:06:50
углами треугольника,
00:06:51
мы можем найти центральную точку
00:06:53
треугольника, усреднив угловые точки,
00:06:56
а затем выдавить вдоль вектор нормали по
00:06:58
высоте пирамиды,
00:06:59
и у нас есть вершина вершины пирамиды, а также
00:07:02
вычисление центрального uv путем усреднения
00:07:05
угловых uvs.
00:07:06
[Музыка]
00:07:07
пришло время вывести и записать новые
00:07:09
треугольники в выходные буферы,
00:07:11
поскольку каждое выполнение функции
00:07:13
выводит по три треугольника
00:07:15
каждый с тремя вершинами и тремя
00:07:17
индексами мы можем найти начальную позицию
00:07:19
в выходных буферах,
00:07:20
умножив идентификатор диспетчеризации на девять,
00:07:23
скоро мы создадим функцию добавления треугольника,
00:07:26
передаем ей начальный индекс и три
00:07:28
угловые точки для треугольников, один, два и
00:07:30
три,
00:07:33
давайте напишем функция добавления треугольника
00:07:35
вычисляет нормаль для нового
00:07:37
треугольника,
00:07:38
затем вызывает make сгенерированную вершину для каждой
00:07:41
точки треугольника,
00:07:42
также передавая нормаль треугольника и
00:07:45
сохраняя каждый результат в сгенерированном
00:07:46
буфере вершин,
00:07:48
напишите эту функцию make сгенерированной вершины,
00:07:50
чтобы скопировать положение и uv
00:07:53
из исходной вершины
00:07:54
в сгенерированную вершину, а также установить
00:07:57
нормаль треугольника
00:07:58
обратно в добавить треугольник, нам также нужно
00:08:01
сохранить эти индексы в индексный
00:08:02
буфер,
00:08:03
и после этого наш треугольник сохраняется,
00:08:06
фактически мы закончили со всем шейдером,
00:08:08
поэтому сохраните его и вернитесь к единице окей,
00:08:11
здесь есть еще одно недостающее звено, давайте
00:08:13
создадим сценарий, чтобы связать все
00:08:15
вместе,
00:08:16
который потребуется в настройках актива,
00:08:18
настройте буферы, отправьте вычислительный
00:08:20
шейдер и верните сгенерированную сетку в
00:08:23
папку редактора,
00:08:24
создайте сценарий c-sharp под названием Pyramid
00:08:26
Baker и откройте он
00:08:28
помечает класс как статический, поскольку нам не
00:08:30
нужно создавать его экземпляры
00:08:32
и удалять наследование моноповедения,
00:08:35
поскольку этот класс
00:08:36
будет заполнять буферы в вычислительном
00:08:37
шейдере, нам нужен c-sharp каждой
00:08:40
структуры вершин, убедитесь, что переменные внутри
00:08:42
структур в том же порядке, что и
00:08:44
в вычислительном шейдере,
00:08:46
например, убедитесь, что позиция
00:08:48
отображается перед uv
00:08:49
для дополнительной безопасности. Этот атрибут указывает
00:08:52
компилятору расположить
00:08:54
поля структуры в памяти таким образом, чтобы теперь они
00:08:56
хорошо работали с вычислительными буферами
00:08:58
при работе с графическим процессором. буферов, нам
00:09:00
нужно вычислить что-то, называемое
00:09:01
шагом,
00:09:02
который представляет собой размер в байтах одного элемента в
00:09:04
буфере
00:09:05
для индексных буферов, шаг - это просто
00:09:07
размер одного целого числа, хотя
00:09:09
буферы вершин состоят из чисел с плавающей запятой,
00:09:11
и вам нужно подсчитать, сколько их
00:09:14
находится в каждая структура на самом деле
00:09:15
не так уж и сложна:
00:09:17
в векторе есть три числа с плавающей запятой,
00:09:21
поэтому в исходной вершине есть пять чисел с плавающей запятой
00:09:23
и восемь в сгенерированной вершине.
00:09:28
Далее нам понадобится функция для разложения
00:09:30
объекта сетки на буферы вершин и индексов. Для этого
00:09:33
я написал эту функцию. что это
00:09:35
выглядит сложным, но на самом деле он просто
00:09:37
извлекает вершины и
00:09:39
треугольники подсетки из объекта сетки, переводя
00:09:42
данные вершин в нашу исходную структуру вершин.
00:09:46
Аналогично, эта функция создает
00:09:48
объект сетки из наших сгенерированных
00:09:50
буферов вершин и индексов,
00:09:53
теперь создает статическую функцию под названием run,
00:09:55
которая принимает вычислительный шейдер и
00:09:57
ресурс настроек пирамиды,
00:09:59
он возвращает логическое значение, сигнализирующее об
00:10:01
успешном завершении процесса,
00:10:02
и сгенерированную сетку в качестве выходного
00:10:04
аргумента внутри.
00:10:13
затем создайте экземпляры выходных буферов в виде
00:10:16
массивов. Помните, что вычислительный шейдер
00:10:18
генерирует девять вершин и индексов для каждого
00:10:20
исходного треугольника. Затем создайте несколько
00:10:24
объектов графического буфера, которые
00:10:26
связаны с буферами графического процессора и
00:10:28
фактически не хранят данные на процессоре.
00:10:31
Целевое перечисление указывает, какой
00:10:33
тип буфера для использования
00:10:35
нам нужны структурированные буферы, поскольку они
00:10:37
работают как массивы,
00:10:39
обязательно передайте правильную длину и
00:10:41
шаг для каждого буфера.
00:10:43
Если вы смотрели мое предыдущее видео о
00:10:45
вычислительных шейдерах, вы можете задаться вопросом, почему
00:10:47
это графические буферы, а не вычислительные
00:10:48
буферы
00:10:50
в коротких графических буферах являются универсальными.
00:10:52
версии вычислительных буферов,
00:10:53
которые могут инкапсулировать любой буфер графического процессора,
00:10:56
лучше всего использовать их, если это возможно, поэтому
00:10:59
теперь нам нужно получить идентификатор нашего основного
00:11:01
ядра в вычислительном шейдере,
00:11:03
используя этот идентификатор, мы можем установить буферы в
00:11:06
шейдере,
00:11:07
имейте в виду это устанавливает
00:11:09
местоположение памяти для каждого буфера,
00:11:10
а не данные, внутри которых мы еще
00:11:13
даже не загрузили.
00:11:14
Потратьте это время, чтобы также установить
00:11:17
высоту пирамиды преобразования и количество
00:11:19
переменных исходного треугольника
00:11:22
для загрузки данных в буферы на вызове графического процессора,
00:11:25
установите данные
00:11:26
на объекты графического буфера, теперь
00:11:29
шейдер готов получить доступ к нашим исходным
00:11:31
данным сетки,
00:11:32
и мы также готовы их отправить. Получите
00:11:35
размер потока из функции ядра
00:11:37
и убедитесь, что мы отправляем достаточное количество
00:11:39
групп, чтобы охватить каждый исходный треугольник, а
00:11:41
затем вызовите диспетчеризацию
00:11:43
в этот момент. процессор продолжит
00:11:45
работу, графический процессор не будет немедленно выполнять наш
00:11:48
шейдер,
00:11:49
однако Unity достаточно умен, поэтому, если
00:11:52
мы вызовем другую функцию, которой нужны данные
00:11:54
из вычислительного шейдера,
00:11:55
он будет ждать, пока шейдер закончит
00:11:58
говорить о том, какой
00:11:59
вызов getdata в буферах загрузить
00:12:01
их содержимое в наши массивы
00:12:04
одно небольшое примечание: никогда не
00:12:06
рекомендуется вызывать getdata во время выполнения,
00:12:08
так как это очень медленно, в редакторе это нормально,
00:12:12
и есть способы обойти это,
00:12:14
которые я планирую изучить в будущих видео,
00:12:17
но вернемся к текущему вызову составить
00:12:19
сетку,
00:12:20
чтобы превратить сгенерированные буферы в
00:12:22
объект сетки,
00:12:24
наконец, освободить буферы, освободив
00:12:26
их зарезервированную память, когда графический процессор
00:12:28
вернет true, так как мы не обнаружили
00:12:30
ошибок,
00:12:32
окей, мы почти закончили, откройте
00:12:35
файл инспектора, который
00:12:37
нам нужно вызвать Pyramidbaker.run, однако
00:12:39
это не так. нужен объект вычислительного шейдера,
00:12:42
так как мы работаем в редакторе, мы можем заставить
00:12:44
его выполнить поиск в базе данных активов и
00:12:46
автоматически получить шейдер.
00:12:48
Эта функция возвращает идентификатор
00:12:50
актива, называемого построителем пирамиды,
00:12:52
мы можем использовать guid для поиска пути к активу и
00:12:56
загрузки актива по пути. чтобы получить реальный
00:12:58
объект шейдера,
00:12:59
теперь запуск вычислительного шейдера может занять
00:13:01
некоторое время, поэтому вызовите
00:13:03
отображение индикатора выполнения, чтобы пользователь знал, что он
00:13:05
работает,
00:13:06
получите объект настроек, который этот инспектор
00:13:08
редактирует, используя
00:13:11
сериализованный объект.target.object,
00:13:12
а затем вызовите Pyramidbaker.run, передав его
00:13:15
необходимые данные
00:13:17
на этом этапе у нас есть сгенерированная сетка,
00:13:19
поэтому мы можем очистить индикатор выполнения,
00:13:21
скрывая ее. Если наш класс пекаря завершился
00:13:23
успешно,
00:13:25
мы должны сохранить сетку как актив, вызовите
00:13:28
этот метод сохранения сетки, прежде чем писать,
00:13:30
но
00:13:31
добавьте пару полезных отладочных сообщений.
00:13:35
в сетке сохранения позвольте пользователю указать
00:13:37
место для сохранения этого актива
00:13:39
с помощью панели сохранения файлов, если она возвращает ноль
00:13:42
или пустую строку, игрок отменил работу,
00:13:45
поэтому нам также следует просто выйти. Этот
00:13:48
относительный путь получения проекта
00:13:50
преобразует путь к файлу в формат, который
00:13:52
нравится единству.
00:13:54
теперь, если мы просто сохраним ресурс там, он
00:13:56
может перезаписать
00:13:57
существующую сетку, мы не хотим этого,
00:14:00
поскольку это может нарушить любые ссылки на
00:14:01
него
00:14:02
в других сценах, заставляя нас исправлять их
00:14:04
каждый раз, когда нам нужно обновить сетку,
00:14:06
вместо этого проверяйте, есть ли уже сетка
00:14:08
по выбранному пути к файлу,
00:14:10
если таковая имеется, мы должны скопировать данные
00:14:13
новой сетки в старую сетку,
00:14:15
сначала очистить старую сетку, подготавливая ее к
00:14:17
получению новых данных,
00:14:19
а затем вызвать копирование, сериализованное в блоке else,
00:14:22
если в файле нет сетки вызов пути,
00:14:25
создание актива и сохранение новой сетки,
00:14:28
наконец, вызов
00:14:29
сохранения ресурсов, чтобы завершить все изменения активов,
00:14:34
наконец, мы закончили, вернитесь в
00:14:36
редактор Unity и протестируйте все,
00:14:38
создайте игровой объект с компонентом
00:14:40
рендеринга сетки и компонентом фильтра сетки
00:14:43
и дайте ему материал устанавливает все в
00:14:46
объекте настроек вашего пирамидального пекаря,
00:14:48
нажмите кнопку «Создать» и подождите, пока он
00:14:50
закончит,
00:14:52
сохраните сгенерированную сетку, а затем установите
00:14:54
эту сетку
00:14:55
в компоненте фильтра сетки в вашей
00:14:57
сцене,
00:14:58
как я уже сказал, этот эффект не очень
00:15:00
практичен, но он может создайте несколько
00:15:02
интересных вещей, на которые стоит посмотреть,
00:15:04
и, надеюсь, вы узнали много нового о
00:15:06
работе в редакторе
00:15:07
и о вычислительных шейдерах. Это видео
00:15:10
достаточно длинное, поэтому
00:15:11
я не буду распространяться, но возможность
00:15:13
генерировать сетки в редакторе очень
00:15:15
полезна,
00:15:16
например, я' Я буду использовать эту систему для
00:15:18
создания сеток травы.
00:15:20
Обязательно подпишитесь и включите
00:15:21
уведомления, чтобы не пропустить видео
00:15:23
об этом.
00:15:24
Кроме того, я хочу потратить секунду, чтобы подключить свой
00:15:26
патреон,
00:15:28
конечно, если вы не можете внести свой вклад, пожалуйста,
00:15:30
не расстраивайтесь. того, что
00:15:31
вы просматриваете эти уроки, более
00:15:32
чем достаточно, но
00:15:34
если вы можете, я дам вам несколько вкусностей,
00:15:36
включая
00:15:37
ранний доступ к видео-опросам по
00:15:40
темам уроков
00:15:41
и загружаемые файлы проектов. Большое вам
00:15:44
всем спасибо за вашу поддержку.
00:15:46
Это также очень поможет мне, если вам понравится
00:15:48
это. видео, так как это заставляет YouTube
00:15:50
больше рекомендовать его другим,
00:15:52
и, пожалуйста, не стесняйтесь оставлять
00:15:54
комментарии, если вам нужны какие-либо разъяснения
00:15:55
по чему-либо,
00:15:57
я читаю их все, как бы вы хотели
00:15:59
использовать вычислительные шейдеры,
00:16:00
есть ли еще одна тема, которую вы хотели бы обсудить посмотреть
00:16:02
видео о еще раз спасибо за просмотр
00:16:05
и сделать игры
00:16:23
[Музыка]
00:16:24
вам

Описание:

✔️ Works in 2020.2 ➕ 2020.3 Compute shaders are scripts than run on the GPU and are specialized at solving problems that can be broken into many parts. If this describes a mesh you want to generate, they can do it super fast! In this video, I'll show you how to procedurally generate a mesh in the Unity Editor - using compute shaders - and save it as a mesh asset file. 👋 Subscribe for weekly game development videos! ► https://www.youtube.com/c/nedmakesgames?sub_confirmation=1 👑 Join my Patreon for extra influence over topics, early access to videos, and downloadable project files! ► https://www.patreon.com/nedmakesgames 🔗 Check out my website for a searchable list of tutorials! ► https://nedmakesgames.github.io/ 🔴 Twitch ► https://www.twitch.tv/nedmakesgames 🐦 Twitter ► https://twitter.com/nedmakesgames 🎮 Discord ► https://discord.com/invite/ubxSVBK 📸 Instagram ► https://www.facebook.com/unsupportedbrowser 👽 Reddit ► https://reddit.com/u/nedmakesgames 🎶 TikTok ► https://www.tiktok.com/@nedmakesgames ☕ Ko-fi ► https://ko-fi.com/nedmakesgames 🎬 Previous videos ► Vertex/Fragment shader basics: https://www.youtube.com/watch?v=7C-mA08mp8o ► Compute shader basics: https://www.youtube.com/watch?v=EB5HiqDl7VE ✨ Follow up videos ► Improved blade grass: https://www.youtube.com/watch?v=6SFTcDNqwaA 💬 Video transcript ► https://docs.google.com/document/d/1Tv18KN5tjgHfMQ10P0Htb2U_1GFhOunv21eAKaDxKg4/edit?usp=sharing 📚 Reference scripts ► https://gist.github.com/NedMakesGames/fef1bddca8061b21845dbe68d0cddfec ⏲️ Timestamps: 0:00 Intro 1:09 Project setup 1:41 The ScriptableObject 3:00 The inspector button 4:05 The compute shader 8:10 The dispatcher 12:35 The finished inspector 14:34 Testing 15:09 Wrap up and credits 🎖️ Credits and references: • pharan: Mesh Saver - https://github.com/pharan/Unity-MeshSaver/blob/master/MeshSaver/Editor/MeshSaverEditor.cs • James "Nihilore" Opie: music "Sleepwalking" - https://www.youtube.com/watch?v=NfMGQQYE1Kw • freepik: Wrinkled paper texture - https://www.freepik.com/premium-vector/wrinkled-paper-texture_711440.htm • Unity Technologies: GraphicsBuffer documentation - https://docs.unity3d.com/2020.2/Documentation/ScriptReference/GraphicsBuffer.html

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial"?mobile menu icon

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

mobile menu iconКак скачать видео "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Generate a Mesh Asset Using Compute Shaders in the Unity Editor! ✔️ 2020.3 | Game Dev Tutorial"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

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