Я делаю параллельное сокращение в вычислительном шейдере.Я рекурсивно вычисляю ограничивающую рамку фрагментов (начиная с G-буфера, полученного в результате рендеринга сцены), а затем ограничивающую рамку кусков ограничивающих прямоугольников и так далее, пока не получу один ограничивающий прямоугольник.
Сначала я делал это с текстурой глубины и одной vec2
, содержащей минимальную и максимальную глубины, и сохранял иерархию в SSBO следующим образом:
// Each tile holds the min and max depth of the subtiles in the level under it.
// Each tile holds 32 items and is 8*4 or 4*8 depending on the level. Conceptually,
// the texDepth texture is level 4.
layout(std430, binding = 5) buffer aabbHierarchy
{
vec2 level0[8 * 4], // one 8*4 tile
level1[32 * 32], // 8*4 4*8 tiles
level2[256 * 128], // 32*32 8*4 tiles
level3[1024 * 1024]; // 256*128 4*8 tiles
};
В конце концов ястолкнулся с проблемами и решил переключиться на полные AABB.Структура и SSBO изменились следующим образом:
struct AABB
{
vec4 low, high;
};
layout(std430, binding = 5) buffer aabbHierarchy
{
AABB level0[8 * 4],
level1[32 * 32],
level2[256 * 128],
level3[1024 * 1024];
};
Конечно, я изменил все, что касалось выполнения фактических вычислений соответственно.
Но теперь, как выясняется, контекст GL замирает, когда явыполнить любой вызов после glUseProgram
в этой программе.Сам по себе вызов glUseProgram
не имеет никаких проблем, но любой вызов GL, который я делаю после зависания моего приложения.Очевидно, этого не произошло, когда изначально использовался vec2
.
. Я выполнил математические расчеты, и мой SSBO составляет 34 636 800 байт (с AABB
), что намного меньше, чем ограничение размера блока SSBO в 128 МБ.,Ни в одной точке моего приложения glCheckError
не возвращается ничего, кроме 0, и все мои компиляции шейдеров, распределение буферов и создание текстур работают (по крайней мере, они не возвращают ошибку).В качестве дополнительного бонуса выделение SSBO того же размера, что и для AABB
, но использование его в качестве шейдера vec2
не приводит к зависанию приложения.
Я использую контекст OpenGL 4.4 с #version 430
в вычислительном шейдере, без расширения.Это работает на ASUS RoG fx553vd с Nvidia GeForce GTX 1050.
РЕДАКТИРОВАТЬ: так как я не мог копировать в MCVE, это должно быть что-то делать с кодом вокруг него.Тем не менее, полное отсутствие сообщений об ошибках действительно странно.Мне удалось найти ту самую строку, которая вызвала ошибку, и воспроизвести тот факт, что в этом контексте любой вызов GL (даже такой простой, как glGetIntegerv
) остановит приложение.
Это довольно большаяпроект, так что извините за это.Проблемная строка - там , а корень проекта там .Обратите внимание, что это ветка aabbHierarchy
, а не master.Я добавил расширенную трассировку, чтобы было ясно, где и когда произойдет сбой программы.
РЕДАКТИРОВАТЬ 2: Я добавил контекст отладки OpenGL, и все, что он сделал для меня, это распечатал пару строк «Подробная информация о буфере»это не поможет.