Войти
Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

Динамичаская компиляция шейдеров

#0
20:34, 28 мар. 2018

Добрый день. В процессе работы над проектом столкнулся с необходимостью динамической сборки шейдеров - в зависимости от выбора пользователя возможны разные алгоритмы смешивания цветов и т.д. Запрограммировать все варианты заранее невозможно естественно.
В результате пришел к такому решению:
1. Создаю технику (файл RuntimeOccluder.xml) для нашего компилируемого на лету шейдера, например:

<technique vs="SimpleRuntime" ps="SimpleRuntime" >

2. Создаем шейдер (в простейшем варианте):

 const char* shaderText =
          "#include \"Shaders/GLSL/Uniforms.glsl\"\n"
           "#include \"Shaders/GLSL/Samplers.glsl\"\n"
           "#include \"Shaders/GLSL/Transform.glsl\"\n"
           "#include \"Shaders/GLSL/ScreenPos.glsl\"\n"
           "#include \"Shaders/GLSL/PostProcess.glsl\"\n"
           "varying vec2 vTexCoord;\n"
           "\n"
           "void VS()\n"
           "{\n"
           "    mat4 modelMatrix = iModelMatrix;\n"
           "    vec3 worldPos = GetWorldPos(modelMatrix);\n"
           "    gl_Position = GetClipPos(worldPos);\n"
           "    vTexCoord = GetTexCoord(iTexCoord);\n"
           "}\n"
           "\n"
           "void PS()\n"
           "{\n"
           "gl_FragColor = texture2D(sDiffMap, vTexCoord);\n"
           "}";

    const String shaderName =  "Shaders/GLSL/SimpleRuntime.glsl";
    ResourceCache *cache = GetSubsystem<ResourceCache>();
    MemoryBuffer memBuffer(shaderText, strlen(shaderText));
    SharedPtr<Shader> shader(new Shader(context_));
    shader->Load(memBuffer);
    shader->SetName(shaderName);
    cache->AddManualResource(shader);
Обращаю внимание, что в инклудниках шейдера необходимо прописывать полный путь.

3. Говорю использовать эту технику в нужном материале:

 mat->SetTechnique(0, cache->GetResource<Technique>("Techniques/RuntimeOccluder.xml"));

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


#1
20:39, 28 мар. 2018

Работает?

#2
20:42, 28 мар. 2018

Да ))

#3
20:56, 28 мар. 2018

Класс! спасибо что поделился

#4
10:16, 18 мая 2018

Zamir
Может сделать редактор шейдеров для UrhoSharp на нодах?

#5
11:20, 18 мая 2018

Давай, как раз решил с шейдерами подружиться

#6
11:23, 18 мая 2018

Zamir
Тогда получается что можно взять мой редактор нод будет но вместо генерации expression tree генерить исходник шейдера.

Можно будет попробовать когда собственно редактирование допилю.

#7
11:33, 18 мая 2018

А где папка Shaders в урхошарпе? они вшиты получается в либу?

#8
12:09, 18 мая 2018

Стандартные шейдеры в CoreData.pak
А так можно свою папку создать - там как с моделями и текстурами и со всем остальным.

#9
12:15, 18 мая 2018

GLoom
> CoreData.pak
Пытался переименовать в zip/rar/arj не распаковывается, не знаешь как открыть?

#10
12:20, 18 мая 2018

Там свой формат. У меня есть код распаковки в Toe.ContentPipeline.Urho3D

#11
12:26, 18 мая 2018

По моему какая та тулза была и в урхо которая пакует/распак

#12
12:36, 18 мая 2018

PackageTool
Examines a directory recursively for files and subdirectories and creates a PackageFile. The package file can be added to the ResourceCache and used as if the files were on a (read-only) filesystem. The file data can optionally be compressed using the LZ4 compression library.

Usage:

PackageTool <directory to process> <package name> [basepath] [options]

Options:
-c      Enable package file LZ4 compression
-q      Enable quiet mode
When PackageTool runs, it will go inside the source directory, then look for subdirectories and any files. Paths inside the package will by default be relative to the source directory, but if an extra path prefix is desired, it can be specified by the optional basepath argument.

#13
12:46, 18 мая 2018

PackageTool точно...
Глеб, у тебя есть проектик, где можно поиграться с пользовательскими шейдерами?

#14
20:38, 23 мая 2018

Zamir
В каком смысле? Можно новый создать.

Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

Тема в архиве.