Войти
ФлеймФорумПрограммирование

Есть ли смысл отказываться от vertex specification?

#0
20:04, 8 дек. 2019

Что мы сейчас имеем:
1. Uniform буферы, которые read only и имеют относительно небольшой размер.
2. Shader storage буферы, которые read and write, размером куда больше, но и обращения к ним (в теории) дороже.
3. Обычные буферы в связке с VAO, которые задают вершины и индексы.
4. gl_VertexID.

ЧСХ, все эти UBO, SSBO, VBO и IBO - это все не разные буферы, это, грубо говоря, разные способы обращения к буферам.
Ничего не мешает создать буфер как VBO а потом присобачить к UBO. И ведь никаких претензий на размер буфера не будет, ведь у буферов нету ограничения на размер.
Ограничения есть у UBO как у особого способа обращения к данным.

И выходит что не только названия у OpenGL галимые старые, но и вообще вся эта концепция с "описанием атрибутов".
Т.е. понятно почему оно так было, но по сути что можно сделать именно сейчас:
1. Разделить буферы на read only, write only и read and write в пределах конвейера (это важно).
2. Запилить в glsl/spir функции для декодирования vec2-vec4 и прочей фигни с буферов.
3. Биндлес буферы.

И все, vertex specification больше не нужна. Просто передаем в разные shader invocation разные gl_VertexID, а он уже сам читает с нужного буфера нужные данные.


#1
23:46, 8 дек. 2019

Great V.
Ну вот в вулкане для пайплайна надо строго указать какой тип вершин будет, то есть теоретически нет разницы указывать это в пайплайне или захардкодить в шейдере.
Чтение из вершин из TBO придумали очень давно, но что-то я не видел чтоб кто-то на него перешел. Видимо неудобно так.

> Запилить в glsl/spir функции для декодирования vec2-vec4 и прочей фигни с буферов.
Они и так уже есть

#2
0:02, 9 дек. 2019

/A\
> Они и так уже есть
Никогда о них не слышал. Можно пример?

> Чтение из вершин из TBO придумали очень давно, но что-то я не видел чтоб кто-то
> на него перешел. Видимо неудобно так.
А причем здесь это?
Я ведь предлагаю вместо всей этой мутни с атрибутами делать так:

uniform read only buffer data_buffer;

main()
{
  gl_Position = vec4((vec2)data_buffer[gl_VertexID * 8], 0, 1);
}

#3
0:13, 9 дек. 2019

Great V.
> А причем здесь это?
При том что это начали предлагать с появлением TBO.

> Можно пример?
unpackHalf2x16 unpackUnorm2x16 unpackSnorm4x8

#4
0:19, 9 дек. 2019

/A\
> unpackHalf2x16 unpackUnorm2x16 unpackSnorm4x8
Спасибо!

> При том что это начали предлагать с появлением TBO.
Я никогда об этом не слышал.
И ведь в этом действительно есть смысл, особенно в сочетании с биндлес ресурсами.
В таком случае исчезают кучи функций и объектов.

#5
(Правка: 0:22) 0:22, 9 дек. 2019

Great V.
Ну в вулкане тебе пришлось бы компилировать шейдер под каждый набор атрибутов, а так просто задаешь парметры и компилируешь пайплайн, что тоже не быстро.
Можно конечно извратиться и патчить spirv ))
В огл с этим проще, да.

ФлеймФорумПрограммирование