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
Класс! спасибо что поделился

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

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