Urho3D
GameDev.ru / Сообщества / Urho3D / Форум / Динамичаская компиляция шейдеров

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

AlexS32Постоялецwww28 мар. 201820:34#0
Добрый день. В процессе работы над проектом столкнулся с необходимостью динамической сборки шейдеров - в зависимости от выбора пользователя возможны разные алгоритмы смешивания цветов и т.д. Запрограммировать все варианты заранее невозможно естественно.
В результате пришел к такому решению:
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"));

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

GLoomУчастникwww28 мар. 201820:39#1
Работает?
AlexS32Постоялецwww28 мар. 201820:42#2
Да ))
ZamirПостоялецwww28 мар. 201820:56#3
Класс! спасибо что поделился
GLoomУчастникwww18 мая 201810:16#4
Zamir
Может сделать редактор шейдеров для UrhoSharp на нодах?
ZamirПостоялецwww18 мая 201811:20#5
Давай, как раз решил с шейдерами подружиться
GLoomУчастникwww18 мая 201811:23#6
Zamir
Тогда получается что можно взять мой редактор нод будет но вместо генерации expression tree генерить исходник шейдера.

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

ZamirПостоялецwww18 мая 201811:33#7
А где папка Shaders в урхошарпе? они вшиты получается в либу?
GLoomУчастникwww18 мая 201812:09#8
Стандартные шейдеры в CoreData.pak
А так можно свою папку создать - там как с моделями и текстурами и со всем остальным.
ZamirПостоялецwww18 мая 201812:15#9
GLoom
> CoreData.pak
Пытался переименовать в zip/rar/arj не распаковывается, не знаешь как открыть?
GLoomУчастникwww18 мая 201812:20#10
Там свой формат. У меня есть код распаковки в Toe.ContentPipeline.Urho3D
ZamirПостоялецwww18 мая 201812:26#11
По моему какая та тулза была и в урхо которая пакует/распак
GLoomУчастникwww18 мая 201812:36#12
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.

ZamirПостоялецwww18 мая 201812:46#13
PackageTool точно...
Глеб, у тебя есть проектик, где можно поиграться с пользовательскими шейдерами?
GLoomУчастникwww23 мая 201820:38#14
Zamir
В каком смысле? Можно новый создать.

/ Форум / Urho3D - игровой движок / ЗАДАВАЙТЕ ВОПРОСЫ

2001—2018 © GameDev.ru — Разработка игр