Помоему практичность данных тестов сомнительна.
Это показания на конкретном драйвере для конкретного ГПУ, будет другой драйвер/ГПУ и могут быть совершенно другие показания.
Надо протестить на разном спектре железа и драйверов, чтобы попробовать поймать тенденцию.
_Wizard_
> Удивил немного TBO - он 3.3 раза дороже чем через UBO. Поэтому выгодней делать
> через текстуру.
Не понял, если TBO в 3 раза дороже UBO зачем выгодней делать через текстуру?
> Ну и определенно на каждый дип передавать параметры через юниформы - это зло.
> Это кажется очевидно. Смешно то, что у нас на проекте именно так) И все хаят gl
> за его тормознутость, хотя на самом деле нужно спроектировать рендер правильно,
> ну и очень много кода переписать.
т.е. GL_ARB_instanced_arrays/GL_EXT_instanced_array все -же шустрее gl_InstanceID?
> можно да, у меня 4к юниформов помоему за раз можно передать. просто смысл теста был в замере стоимости АПИ вызова. поэтому надо собирать данные в большой массив и засылать одной командой.
Интересует скорость UBO с против 1 вызова glUniformXX (или нескольких) с большим массивом констант, (размер UBO конечно равен размеру массива констант для glUniformXX)
> очень много всего, конечно хотелось бы все замерить - времени мало, много
> планов на другие вещи
еще интересует immutable buffers/textures по сравнению с обычными буферами и текстурами.
_Wizard_
> и нет - кватернионы в вершинном шейдере дороже будут:
> - Трансформация матрицей: 3 раза dot-product
> - Повернуть вектор кватернионом: 2 cross-products, 2 dot-products, 3
> vector-scaler multiplies, 3 vector additions + смещение
Ага, информация очень полезная. Все-же для большого числа костей может все-же передать по шине меньше данных, а на современном железе все это быстро посчиается? или все-же разница в числе инструкция сильно покрывает затраты передачи констант, если так то mat4x3 иделальное решение для скелетной анимации.
Executor
На самом деле кто знал - нового для себя ни чего не увидел. А как тест просто подтверждение теории. Конкретные тесты на большом количестве железа америку не откроют, только использование расхождения с целью оптимизации на отдельном железе. Но это и так понятно что по сути от всего этого избавляться надо. Вообще не представляю что есть кто то, кто подобных тестов на месте не делал.
Andrey
> > Ну и определенно на каждый дип передавать параметры через юниформы - это зло.
> > Это кажется очевидно. Смешно то, что у нас на проекте именно так) И все хаят
> > gl
> > за его тормознутость, хотя на самом деле нужно спроектировать рендер
> > правильно,
> > ну и очень много кода переписать.
> т.е. GL_ARB_instanced_arrays/GL_EXT_instanced_array все -же шустрее
> gl_InstanceID?
Какая тут связь?
> Интересует скорость UBO с против 1 вызова glUniformXX (или нескольких) с
> большим массивом констант
Ты когда прочитаешь про использование uniforms ?
Andrey
>Не понял, если TBO в 3 раза дороже UBO зачем выгодней делать через текстуру?
тебе нужно много данных хранить где то (у юниформ буферов относительно маленький размер)
тесты показывают что в текстуре хранить выгоднее, чем в TBO
>Интересует скорость UBO с против 1 вызова glUniformXX (или нескольких) с большим массивом констант, (размер UBO конечно равен размеру массива констант для glUniformXX)
у UBO гарантировано 65кб+, сколько можно передать через юниформы - отдельной командой надо узнавать
+-думаю также
>т.е. GL_ARB_instanced_arrays/GL_EXT_instanced_array все -же шустрее gl_InstanceID?
ну, один из самых быстрых...
через gl_InstanceID - зависит от того где данные держать
изначальной идеей - было сравнить GL с DX9-11
меня наверное не хватит) если кто то соберется - будет отличная статья
я скорее буду про DX12 писать
_Wizard_
А нет желания выложить тесты в открытый доступ?
innuendo
>А нет желания выложить тесты в открытый доступ?
не понял вопрос может,
в самом конце статьи есть - Исходный код всех примеров
_Wizard_
да, есть, я невнимательно читал
и не в трезвом состоянии
Сделал бенчмарк. В самом конце статьи можно скачать: "Исходный код всех примеров"
Запускаем BENCHMARK_OpenGL_API_overhead.exe (или компилим) - результыты пишет в benchmark_results.txt
Тест занимает секунд 5
У меня выдает:
CPU: Intel(R) Core(TM) i5-4460 CPU @ 3.20GHz
GPU: AMD Radeon (TM) R9 380 Series
Parameters: CURRENT_NUM_INSTANCES 1000 NUM_FBO_CHANGES 200
---States changing time:
SIMPLE_DIPS_TEST 0.21
FBO_CHANGE_TEST 1.43
SHADERS_CHANGE_TEST 2.41
VBO_CHANGE_TEST 0.76
ARRAY_OF_TEXTURES_TEST 3.08
TEXTURES_ARRAY_TEST 0.68
UNIFORMS_SIMPLE_CHANGE_TEST 1.07
UNIFORMS_SSBO_TEST 0.63
---API call cost:
glBindFramebuffer: 6.93 3360%
glUseProgram: 2.20 1068%
glBindVertexArray: 0.55 268%
glBindTexture: 0.48 232%
glDrawRangeElements: 0.21 100%
glUniform4fv: 0.09 42%
---Instancing time:
UBO_INSTANCING 0.15
TBO_INSTANCING 0.50
SSBO_INSTANCING 0.17
VBO_INSTANCING 0.15
TEXTURE_INSTANCING 0.18
UNIFORMS_INSTANCING 5.93
MULTI_DRAW_INDIRECT_INSTANCING 6.53
Из интересного:
1. glMultiDrawElementsIndirect() выдал 6.53 ms , вместо 13 ms, т.е. в двое меньше. Связано с тем, что количество инстансов/дипов в бенчмарке стало 1к (вместо 2к, как в статье)
2. стоимость glBindVertexArray и glBindTexture ниже чем в статье (что-то не правильно посчитал первый раз видимо)
States changing time немного не в том порядке, как в статье - обращаем внимание
Выкладываем результаты - интересно
CPU: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
GPU: GeForce GTX 690/PCIe/SSE2
Parameters: CURRENT_NUM_INSTANCES 1000 NUM_FBO_CHANGES 200
---States changing time:
SIMPLE_DIPS_TEST 0.13
FBO_CHANGE_TEST 1.71
SHADERS_CHANGE_TEST 2.16
VBO_CHANGE_TEST 0.22
ARRAY_OF_TEXTURES_TEST 1.12
TEXTURES_ARRAY_TEST 0.23
UNIFORMS_SIMPLE_CHANGE_TEST 0.73
UNIFORMS_SSBO_TEST 0.36
---API call cost:
glBindFramebuffer: 8.41 6630%
glUseProgram: 2.03 1604%
glBindVertexArray: 0.09 74%
glBindTexture: 0.17 131%
glDrawRangeElements: 0.13 100%
glUniform4fv: 0.06 47%
---Instancing time:
UBO_INSTANCING 2.45
TBO_INSTANCING 4.67
SSBO_INSTANCING 2.50
VBO_INSTANCING 2.45
TEXTURE_INSTANCING 26.09
UNIFORMS_INSTANCING 6.74
MULTI_DRAW_INDIRECT_INSTANCING 10.87
---Shader error in vertex shader "tests/instancing/texture_instancing_vs" file ShaderInfoLog 0(25) : error C1101: ambiguous overloaded function reference "floor(int)" (0) : float floor(float) (0) : gp5 cp50 fp50 vp50 gp50 cpf fpf vpf gpf superp float floor(superp float) (0) : gp5 gp4 cp50 fp50 vp50 gp50 cpf fpf vpf gpf lowp float floor(lowp float) (0) : gp5 gp4 cp50 fp50 vp50 gp50 cpf fpf vpf gpf mediump float floor(mediump float) (0) : gp5 gp4 cp50 fp50 vp50 gp50 cpf fpf vpf gpf float floor(float) Shader::Shader(): GLSL relink error
У меня тоже самое, что и у CD
нвидиа GTX 970
Окей, поменял floor на int, завелось:
CPU: Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
GPU: GeForce GTX 970/PCIe/SSE2
Parameters: CURRENT_NUM_INSTANCES 1000 NUM_FBO_CHANGES 200
---States changing time:
SIMPLE_DIPS_TEST 0.11
FBO_CHANGE_TEST 1.28
SHADERS_CHANGE_TEST 2.04
VBO_CHANGE_TEST 0.22
ARRAY_OF_TEXTURES_TEST 1.04
TEXTURES_ARRAY_TEST 0.23
UNIFORMS_SIMPLE_CHANGE_TEST 0.75
UNIFORMS_SSBO_TEST 3.02
---API call cost:
glBindFramebuffer: 6.29 5481%
glUseProgram: 1.93 1679%
glBindVertexArray: 0.10 87%
glBindTexture: 0.15 134%
glDrawRangeElements: 0.11 100%
glUniform4fv: 0.06 55%
---Instancing time:
UBO_INSTANCING 2.38
TBO_INSTANCING 4.37
SSBO_INSTANCING 2.41
VBO_INSTANCING 2.38
TEXTURE_INSTANCING 2.40
UNIFORMS_INSTANCING 6.11
MULTI_DRAW_INDIRECT_INSTANCING 247.24
CPU: AMD FX(tm)-4350 Quad-Core Processor
GPU: AMD Radeon R7 200 Series
Parameters: CURRENT_NUM_INSTANCES 1000 NUM_FBO_CHANGES 200
---States changing time:
SIMPLE_DIPS_TEST 0.27
FBO_CHANGE_TEST 3.74
SHADERS_CHANGE_TEST 4.06
VBO_CHANGE_TEST 1.27
ARRAY_OF_TEXTURES_TEST 4.89
TEXTURES_ARRAY_TEST 1.02
UNIFORMS_SIMPLE_CHANGE_TEST 1.54
UNIFORMS_SSBO_TEST 0.98
---API call cost:
glBindFramebuffer: 18.42 6835%
glUseProgram: 3.79 1407%
glBindVertexArray: 1.00 372%
glBindTexture: 0.77 285%
glDrawRangeElements: 0.27 100%
glUniform4fv: 0.13 47%
---Instancing time:
UBO_INSTANCING 0.68
TBO_INSTANCING 1.07
SSBO_INSTANCING 0.68
VBO_INSTANCING 0.56
TEXTURE_INSTANCING 0.45
UNIFORMS_INSTANCING 8.49
MULTI_DRAW_INDIRECT_INSTANCING 29.42
_Wizard_
Вылетает на Intel HD 4000:
D:\DownLoads\GL_API_overhead\GL_WorkingProj>BENCHMARK_OpenGL_API_overhead.exe
---Shader error in vertex shader "tests/instancing/ubo_instancing_vs" file
ShaderInfoLog
WARNING: 0:2: '#extension' : 'GL_EXT_bindable_uniform' is not supported
ERROR: 0:10: 'uniform' : syntax error syntax error
Shader::Shader(): GLSL relink error
Старое расширение, видно Intel не успел его поддержать и сразу сделал UBO.
Еще бы потестить GL_ARB_sampler_buffer_objects/GL_ARB_multibind
Тема в архиве.