Covellite++  Version: 2.3.0 Revision: 2580 Platform: x64 Build: 15:23 16.10.2020
Кроссплатформенный фреймворк для разработки приложений на С++
Пользовательский константный буфер

Пользовательский константный буфер

Фреймворк предоставляет возможность создания константного буфера для передачи данных шейдеру любого размера и структуры.

Для его использования необходимо:

  • В шейдере и коде объявить требуемую структуру (ее имя может быть любым).
struct UserPointLights
{
Point_t Lights[8];
int UsedSlotCount;
};
  • В шейдере объявить константный буфер:
    • Имя структуры (UserPointLights) должно соответствовать объявлению.
    • Имя объявления константного буфера (cbPointLights) - может быть любым и передается как параметр name компонента константного буфера.
    • Имя объекта константного буфера (PointLights) - может быть любым.
COVELLITE_DECLARE_CONST_USER_BUFFER(UserPointLights, cbPointLights, PointLights);
// Далее можно использовать данные из PointLights
if (PointLights.UsedSlotCount > 0)
{
...
  • В нужное место добавить компонент константного буфера:
UserPointLights PointLights;
const ::covellite::api::cbBufferMap_t<void> Mapper = [=](void * _pData)
{
// Заполнить структуру PointLights
// ...
memcpy(_pData, &PointLights, sizeof(PointLights));
return false;
};
const auto pUserConstBuffer = Component_t::Make(
{
{ uT("id"), Id },
{ uT("type"), uT("Buffer") },
{ uT("mapper"), Mapper },
{ uT("name"), uT("cbPointLights") },
{ uT("size"), sizeof(UserPointLights) },
});
Заметки
  • Структура должна состоять из элементов, размер каждого из которых кратен 16 байтам.
  • Следует учитывать, что оверхед от передачи константного буфера шейдеру прямо зависит от размера структуры, поэтому передача больших объемов данных (десятки килобайт) каждому объекту заметно ударит по производительности. Рекомендуется использовать такой буфер либо для передачи каждому объекту данных небольшого размера, либо данных большого размера однократно для сцены (например, таким образом можно передавать данные обо всех точечных источниках света сцены при использовании инстансинга).