PBR-материалы

PBR (Physically Based Rendering) — это метод рендеринга в 3D-графике, который стремится максимально точно имитировать поведение света в реальном мире. Он основан на физических законах оптики, благодаря чему объекты выглядят реалистично при любых условиях освещения. PBR-материалы описываются параметрами, которыми связаны с их физическими свойствами, а освещение и отражения вычисляются по физическим формулам - например, модели BRDF. PBR дает реалистичные и стабильные при разных источниках света материалы, единый стандарт текстурирования, совместимость между разными движками, качественные отражения и тени. Для освещения используется IBL (Image Based Lighting) - окружающее освещение берется из HDRI-карты, что делает материалы реалистичными.

EV Toolbox с версии 3.6.0 поддерживает PBR-материалы. Для создания IBL используется утилита cmgen из движка Google Filament:

  1. Скачайте Google Filament с официального гитхаба компании Google, выбрав версию для вашей операционной системы.

  2. Создайте папку на диске, например textures и поместите туда HDRI .exr файл

  3. Откройте командную строку и перейдите в эту папку (например cd C:\textures)

  4. Выполните команду <путь до 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.

  5. На выходе будет создано 4 файла: _ibl.ktx, _skybox.ktx, sh.txt и DFG_LUT.dds файл. Все файлы, кроме _skybox.ktx необходимо добавить в ресурсы проекта(также поставьте галочки «Всегда добавлять в пакет на экспорте», «Добавлять в assets на экспорте»).

  6. Создайте файл 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 освещения.