Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL. Constant Buffer для бедных.

OpenGL. Constant Buffer для бедных.

Страницы: 1 2 3 4 5 6 Следующая »
DampireПостоялецwww19 фев. 201816:17#0
Хочу загружать данные за один вызов. ©™ Но опенжл не хочет, потому что вектора у него столбцами. Или матрицы неправильно работают.

Суть.
Заменяем это

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;
};
На это (структура разумеется выровнена как положено до кратной 64 байтам)
// 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. Перелопачивать весь рендер не очень хочется.

Правка: 19 фев. 2018 16:19

dayllengerПользовательwww19 фев. 201818:09#1
layout (std140, row_major) uniform;
не покатит?
DampireПостоялецwww19 фев. 201818:17#2
Надо наоборот сделать. я хочу выпилить UBO и впилить костыль на основе mat4[xxx]. на инстансинг я так и не перешел, нужды нет, а перелопачивать весь рендер на одиночные юниформы я не хочу. Оверхед UBO лишний.

Мне непонятно вот что. При загрузке в UBO матрицы автоматом транспонируются? Потому-что при загрузке с транспонированием (glUniformMatrix4fv(..., true, ...)) все один хрен не работает. gDebuggerом водил, данные вроде все норм в буферах. Шейдер портировался, пол логике прошелся - все как было.

dayllengerПользовательwww19 фев. 201819:05#3
Если стоит row_major, то да, в какой-то момент при загрузке в UBO они транспонируются.
DampireПостоялецwww20 фев. 20188:48#4
nvm, это я тупой. ошибся в дефайнах лэйаута другого объекта, пропустив поле.

Правка: 20 фев. 2018 8:49

SuslikМодераторwww20 фев. 201810:57#5
Dampire
> vec2 resolution;
ты в курсе, что оно будет выравниваться до vec4? то есть если будут другие float/vec2 поля, то их перекроет?

> Хочу загружать данные за один вызов. ©™
я не понял, где сам-то виновник торжества?

innuendoПостоялецwww20 фев. 201811:07#6
facepalm | OpenGL. Constant Buffer для бедных.
DampireПостоялецwww20 фев. 201811:11#7
Suslik
Да, в курсе. Говорю же, что структуры все выровнены как положено. Все уже рендерится. Вин по сравнению с UBO - ~1мс.
DampireПостоялецwww20 фев. 201811:41#8
innuendo
Вообще-то твой совет из одного эпичного треда. (что оптимальнее массив с дефайнами, чем UBO/SSBO).

Правка: 20 фев. 2018 11:42

g-contПостоялецwww21 фев. 201815:02#9
Раскройте уже эту великую тайну, что там за данные такие, которые нельзя загрузить за один вызов, но очень хочется?

И как можно рисовать что-то, не имея достаточно данных? Или смысл вообще не в отрисовке, а именно в загрузке и непременно за один вызов?

innuendoПостоялецwww21 фев. 201819:33#10
Dampire
я про другое - про виновника:)
MrShoorУчастникwww21 фев. 201822:50#11
Dampire
> Все уже рендерится. Вин по сравнению с UBO - ~1мс.
Дохрена какой то большой вин. На каком железе измеряешь?
innuendoПостоялецwww21 фев. 201822:52#12
Dampire
> Все уже рендерится. Вин по сравнению с UBO - ~1мс.

%? да, какое железо?

Dampire
> (что оптимальнее массив с дефайнами, чем UBO/SSBO).

мой поинт был не в оптимальности, а в том, чтобы для начала нужно прочитать документацию

Правка: 21 фев. 2018 22:53

DampireПостоялецwww22 фев. 20187:41#13
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 на массиве.
(По хорошему надо еще потестить на старом новуте с еще более слабым процом и видюхой ушедшей в тротлинг, но мне лень его собирать).
SuslikМодераторwww22 фев. 20187:51#14
Dampire
> GeForce GT 1030 + i3 3.7GHz -  1.9-2.0мс на UBO, 1.1-1.2мс на массиве.
и что это за сцена такая, что у тебя время работы с юниформами вообще занимает как мимум 50% времени исполнения?
Страницы: 1 2 3 4 5 6 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр