PBR-материалы¶
PBR (Physically Based Rendering) — это метод рендеринга в 3D-графике, который стремится максимально точно имитировать поведение света в реальном мире. Он основан на физических законах оптики, благодаря чему объекты выглядят реалистично при любых условиях освещения. PBR-материалы описываются параметрами, которыми связаны с их физическими свойствами, а освещение и отражения вычисляются по физическим формулам - например, модели BRDF. PBR дает реалистичные и стабильные при разных источниках света материалы, единый стандарт текстурирования, совместимость между разными движками, качественные отражения и тени. Для освещения используется IBL (Image Based Lighting) - окружающее освещение берется из HDRI-карты, что делает материалы реалистичными.
EV Toolbox с версии 3.6.0 поддерживает PBR-материалы. Для создания IBL используется утилита cmgen из движка Google Filament:
Скачайте Google Filament с официального гитхаба компании Google, выбрав версию для вашей операционной системы.
Создайте папку на диске, например
texturesи поместите туда HDRI .exr файлОткройте командную строку и перейдите в эту папку (например
cd C:\textures)Выполните команду
<путь до filament>\bin\cmgen.exe --ibl-dfg="DFG_LUT.dds" -x ./ -f ktx ./<hdrifilename>.exr, например команда(на платформе Windows)C:\filament-windows\bin\cmgen.exe --ibl-dfg="DFG_LUT.dds" -x ./ -f ktx ./hdrmap.exrиспользует утилитуcmgen.exeиз папкиfilament-windowsна дискеC:\, необходимые файлы будут созданы в текущей папкеtexturesна дискеC:\, HDR карта, из которой будет создано IBL-освещение, -C:\textures\hdrmap.exr.На выходе будет создано 4 файла: _ibl.ktx, _skybox.ktx, sh.txt и DFG_LUT.dds файл. Все файлы, кроме _skybox.ktx необходимо добавить в ресурсы проекта(также поставьте галочки «Всегда добавлять в пакет на экспорте», «Добавлять в assets на экспорте»).
Создайте файл main.lua, добавьте его в ресурсы проекта. Пропишите следующие строки кода:
local g = require("base/util/graphics.lua")
local model = reactorController:getReactorByName("model")
local texCubeMapIBL, uniformSH, texDFGLut = g.createIBL()
local stateSet = model.node:getOrCreateStateSet()
stateSet:setMode(GLenum.GL_LIGHTING, osg.StateAttribute.ON)
stateSet:setDefine("EV_GL_LIGHTING_IBL" , osg.StateAttribute.ON)
stateSet:setDefine("EV_GL_LIGHTING_IBL_Z_UP" , osg.StateAttribute.ON)
stateSet:setDefine("EV_GL_LIGHT0" , osg.StateAttribute.OFF)
stateSet:setTextureAttributeAndModes(10, texCubeMapIBL)
local envMapUniform = osg.Uniform.Int("ev_EnvironmentMap", 10)
stateSet:addUniform(envMapUniform)
stateSet:addUniform(uniformSH)
stateSet:setTextureAttributeAndModes(11, texDFGLut)
local dfgLutUniform = osg.Uniform.Int("ev_DFGLut", 11)
stateSet:addUniform(dfgLutUniform)
local iblLuminanceUniform = osg.Uniform.Float("ev_IblLuminance", 1.35)
stateSet:addUniform(iblLuminanceUniform)
Где model - название вашей модели в проекте. Параметром iblLuminanceUniform (1.35, можно указать любое число) регулируется интенсивность IBL освещения.