Вычисления в шейдере и вывод данных в скрипт

Программирование на Юнити.

Вычисления в шейдере и вывод данных в скрипт

Сообщение AlexandrBuryakov 21 фев 2019, 01:47

Здравствуйте. Скажите, какие есть способы передать, а потом взять обработанные данные из шейдера?
Нужно закинуть несколько массивов, произвести много разных вычислений между ними (float или Vector3) и потом забрать результаты. На сколько я понял compute shader это dx11 и он у меня не поддерживается. Так что dx9 остаётся.
Какие в принципе есть способы в HLSL что-то забрать из шейдера (gpu) в обычный скрипт (cpu). Там вроде как с этим проблемы потому, что это не самая быстрая операция, какие есть варианты по быстрее? Делать это нужно каждый фиксированный кадр.
Может можно через массив вертексов передавать данные и потом забирать? Только вот как несколько массивов между собой вычислять и при этом на сколько это возможно параллельно? И так, что бы каждый элемент одного массива мог произвести вычисления с каждым из элементов этого же массива + вычисления с данными других массивов? Для избежания конфликтов из-за изменения данных при расчётах, можно просто использовать отдельный массив для результатов, в который будут складываться изменения, а потом обновляться основные массивы при передаче информации в CPU перед следующим циклом вычислений.
...
Буду рад примеру загрузки и выгрузки двух массивов складываемых между собой и каждый элемент первого массива вычисляется параллельно остальным элементам этого же первого массива, если это возможно.)))
Спасибо. :ymhug:
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Вычисления в шейдере и вывод данных в скрипт

Сообщение Jarico 21 фев 2019, 12:13

https://docs.unity3d.com/ScriptReference/Material.html

CopyPropertiesFromMaterial Copy properties from other material into this material.
DisableKeyword Unset a shader keyword.
EnableKeyword Sets a shader keyword that is enabled by this material.
FindPass Returns the index of the pass passName.
GetColor Get a named color value.
GetColorArray Get a named color array.
GetFloat Get a named float value.
GetFloatArray Get a named float array.
GetInt Get a named integer value.
GetMatrix Get a named matrix value from the shader.
GetMatrixArray Get a named matrix array.
GetPassName Returns the name of the shader pass at index pass.
GetShaderPassEnabled Checks whether a given Shader pass is enabled on this Material.
GetTag Get the value of material's shader tag.
GetTexture Get a named texture.
GetTextureOffset Gets the placement offset of texture propertyName.
GetTexturePropertyNameIDs Return the name IDs of all texture properties exposed on this material.
GetTexturePropertyNames Returns the names of all texture properties exposed on this material.
GetTextureScale Gets the placement scale of texture propertyName.
GetVector Get a named vector value.
GetVectorArray Get a named vector array.
HasProperty Checks if material's shader has a property of a given name.
IsKeywordEnabled Is the shader keyword enabled on this material?
Lerp Interpolate properties between two materials.
SetBuffer Sets a named ComputeBuffer value.
SetColor Sets a named color value.
SetColorArray Sets a color array property.
SetFloat Sets a named float value.
SetFloatArray Sets a float array property.
SetInt Sets a named integer value.
SetMatrix Sets a named matrix for the shader.
SetMatrixArray Sets a matrix array property.
SetOverrideTag Sets an override tag/value on the material.
SetPass Activate the given pass for rendering.
SetShaderPassEnabled Enables or disables a Shader pass on a per-Material level.
SetTexture Sets a named texture.
SetTextureOffset Sets the placement offset of texture propertyName.
SetTextureScale Sets the placement scale of texture propertyName.
SetVector Sets a named vector value.
SetVectorArray Sets a vector array property.
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Вычисления в шейдере и вывод данных в скрипт

Сообщение AlexandrBuryakov 21 фев 2019, 19:21

Да, это всё очень круто, но к сожалению у меня мозгов не хватает разобраться с подготовительной частью, какой так сказать обвес кода нужен ко всему этому.
Я просто не понимаю как именно мне использовать несколько GetVectorArray и SetVectorArray, всё время кажется, что делаю что-то не так, даже если заработает. И похоже они ограничены длинной в 1024 элемента (0-1023).
Можно максимально простой пример?
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Вычисления в шейдере и вывод данных в скрипт

Сообщение Yaro 25 фев 2019, 02:28

Мне аж интересно стало, чем тебе CPU не угодил, что ты ему с GPU решил изменить.
Yaro
UNIт
 
Сообщения: 86
Зарегистрирован: 20 сен 2016, 21:44

Re: Вычисления в шейдере и вывод данных в скрипт

Сообщение Dewa1s 25 фев 2019, 07:19

Yaro писал(а):Мне аж интересно стало, чем тебе CPU не угодил, что ты ему с GPU решил изменить.

ну, тем что у какого-нибудь i7 8700 производительность всего 200 гигафлопс, против 6.5 террафлопс у той же 1070 ?
Аватара пользователя
Dewa1s
Старожил
 
Сообщения: 564
Зарегистрирован: 26 дек 2011, 02:12

Re: Вычисления в шейдере и вывод данных в скрипт

Сообщение AlcogGMS 26 фев 2019, 17:18

ну тогда Compute shaders вам в помощь
AlcogGMS
UNIт
 
Сообщения: 50
Зарегистрирован: 11 янв 2019, 21:57


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14