Может ли размер блока интерфейса быть больше, чем базовый UBO в Opengl? - PullRequest
0 голосов
/ 28 апреля 2018

Давайте объявим большой блок интерфейса в шейдере:

struct InstancingData
{
    // whatever
};

#define LARGE_SIZE 1048576
layout(std140, row_major, binding = 0) uniform InstanceBlock
{
    InstancingData data[LARGE_SIZE];
};

Затем я хочу связать небольшой блок UBO, содержащий менее LARGE_SIZE записей InstancingData с этим блоком. Это может быть либо glBingBufferBase небольшого массива, либо glBindBufferRange небольшого диапазона в большем массиве.

Следовательно, я буду индексировать data только с индексами, меньшими, чем позволяет размер базового буфера, используя соответствующую униформу или gl_VertexID. Так что формально это не должно приводить к нарушению доступа.

Будут ли эти действия вызывать ошибку или неопределенное поведение в любой версии OpenGL?

Другой путь:

Я объявил

InstancingData data[1];

Затем я связал буфер из 42 структур и проиндексировал все из них (квадратное ложе 6х7 экземпляров моделей), и он отлично работал на моей машине. Гарантируется ли работа в любом месте?

1 Ответ

0 голосов
/ 28 апреля 2018

С ARB_uniform_buffer_object :

Если какой-либо активный равномерный блок не поддерживается достаточно большим объект буфера, результаты выполнения шейдера не определены, и могут привести к прерыванию или прекращению GL.

Этого достаточно, чтобы сказать, что поддержка InstancingData data[LARGE_SIZE]; с небольшим буфером недопустима.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...