Хочу загружать данные за один вызов. ©™ Но опенжл не хочет, потому что вектора у него столбцами. Или матрицы неправильно работают.
Суть.
Заменяем это
layout (std140) uniform PerFrame { mat4 view; mat4 projection; mat4 invProjView; vec4 fogColor; vec4 ambientColor; // data[0] = zNear, data[1] = zFar, data[2] = fogStart, data[3] = fogEnd vec4 data; // data2[0] = r addition, data2[1] = g addition, data2[2] = b addition data[4].brightness vec4 data2; vec2 resolution; };
// PER FRAME #define VIEW per_frame[0] #define PROJ per_frame[1] #define INV_PROJ per_frame[2] #define FOG_COLOR per_frame[3][0] #define AMBIENT_COLOR per_frame[3][1] #define ZNEAR per_frame[3][2].x #define ZFAR per_frame[3][2].y #define FOG_START per_frame[3][2].z #define FOG_END per_frame[3][2].w #define POST per_frame[3][3] #define RESOLUTION per_frame[4][0] uniform mat4[5] per_frame;
Разумеется оно не работает. Как малой кровью заставить это работать? Особенно при условии, что часть рендера останется на UBO, часть на почтиUBO. Перелопачивать весь рендер не очень хочется.
layout (std140, row_major) uniform;
Надо наоборот сделать. я хочу выпилить UBO и впилить костыль на основе mat4[xxx]. на инстансинг я так и не перешел, нужды нет, а перелопачивать весь рендер на одиночные юниформы я не хочу. Оверхед UBO лишний.
Мне непонятно вот что. При загрузке в UBO матрицы автоматом транспонируются? Потому-что при загрузке с транспонированием (glUniformMatrix4fv(..., true, ...)) все один хрен не работает. gDebuggerом водил, данные вроде все норм в буферах. Шейдер портировался, пол логике прошелся - все как было.
Если стоит row_major, то да, в какой-то момент при загрузке в UBO они транспонируются.
nvm, это я тупой. ошибся в дефайнах лэйаута другого объекта, пропустив поле.
Dampire
> vec2 resolution;
ты в курсе, что оно будет выравниваться до vec4? то есть если будут другие float/vec2 поля, то их перекроет?
> Хочу загружать данные за один вызов. ©™
я не понял, где сам-то виновник торжества?
Suslik
Да, в курсе. Говорю же, что структуры все выровнены как положено. Все уже рендерится. Вин по сравнению с UBO - ~1мс.
innuendo
Вообще-то твой совет из одного эпичного треда. (что оптимальнее массив с дефайнами, чем UBO/SSBO).
Раскройте уже эту великую тайну, что там за данные такие, которые нельзя загрузить за один вызов, но очень хочется?
И как можно рисовать что-то, не имея достаточно данных? Или смысл вообще не в отрисовке, а именно в загрузке и непременно за один вызов?
Dampire
> Все уже рендерится. Вин по сравнению с UBO - ~1мс.
Дохрена какой то большой вин. На каком железе измеряешь?
Dampire
> Все уже рендерится. Вин по сравнению с UBO - ~1мс.
%? да, какое железо?
Dampire
> (что оптимальнее массив с дефайнами, чем UBO/SSBO).
мой поинт был не в оптимальности, а в том, чтобы для начала нужно прочитать документацию
MrShoor
На двух железках тестил. Дипов под две сотни. Запускалось все неоднократно и поочередно, все в рамках погрешности.
GeForce GT 1030 + i3 3.7GHz - 1.9-2.0мс на UBO, 1.1-1.2мс на массиве.
GeForce GT 620 + i5 3.2GHz - 7.5-7.6мс на UBO, 6.5-6.6 на массиве.
(По хорошему надо еще потестить на старом новуте с еще более слабым процом и видюхой ушедшей в тротлинг, но мне лень его собирать).
Dampire
> GeForce GT 1030 + i3 3.7GHz - 1.9-2.0мс на UBO, 1.1-1.2мс на массиве.
и что это за сцена такая, что у тебя время работы с юниформами вообще занимает как мимум 50% времени исполнения?