Войти
ПрограммированиеФорумГрафика

OpenGL, VAO и тормоза (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
10:57, 15 сен. 2020

Suslik

> задай всем вершинам своих 20000 линий одинаковые координаты (например, нулевые)

Нарисовал 5 линий с ненулевыми коорд. + еще 20 тыс. с нулевыми, панорамируется без тормозов. Время полного цикла отрисовки 0,5 мс. Значит, тормозит обработка вершин?
Вершинный шейдер:
#version 130

in vec3 EntityColor;
in uint  Pattern;
in float Factor;

flat out vec3 VertexColor;
flat out uint VertexPattern;
flat out float VertexFactor;

flat out vec3 StartPos;
out vec3 VertPos;

void main(void) {
  vec4 Pos    = gl_ModelViewProjectionMatrix * gl_Vertex;
  gl_Position = Pos;
  VertexColor = EntityColor;
  VertexPattern = Pattern;
  VertexFactor = Factor;
  VertPos     = Pos.xyz / Pos.w;
  StartPos    = VertPos;
}
Хотя я выше уже писал, что отключал шейдер, но тормоза оставались.
ЗЫ.  Блендинг и всякую красоту не включал, не нужна она.

#31
10:59, 15 сен. 2020

Уточню, еще раз. AutoCAD у меня таскает 20 тыс. линий без всяких тормозов.

#32
11:06, 15 сен. 2020

Стоп. При нулевых вершинах - нулевое время на растеризацию. Тормоза исчезли. Значит тормозит она?
Тогда вот фрагментный:

#version 130

flat in vec3 VertexColor;
flat in uint VertexPattern;
flat in float VertexFactor;

flat in vec3 StartPos;
in vec3 VertPos;

uniform vec2  Resolution;

void main()
{
  gl_FragColor = vec4(VertexColor, 1.0);
  vec2  Dir  = (VertPos.xy - StartPos.xy) * Resolution / 2.0;
  float Dist = length(Dir);

  uint BitPos = uint(round(Dist / VertexFactor)) & 31U;

  if (uint((VertexPattern & (1U << BitPos))) == 0U)
    discard;
}

#33
11:14, 15 сен. 2020

Проверил еще раз при отключенном шейдере. Тормозит. Макс. время полного цикла отрисовки 31 мс.

#34
(Правка: 11:22) 11:15, 15 сен. 2020

greencad
> wglMakeCurrent(0, 0);
Почему ты везде это пишешь? Это баг!
foxes
> wglMakeCurrent(FDC, 0);

greencad
> тормозит обработка вершин?
Нет, скорее всего тормозит рендеринг.

greencad
> AutoCAD у меня таскает 20 тыс. линий без всяких тормозов.
Не факт что он именно линии рисует, а не трианглы.

#35
11:35, 15 сен. 2020

foxes
wglMakeCurrent(FDC, FRC) поставил только в инициализации.
wglMakeCurrent(FDC, 0) поставил только в Destroy.

> wglMakeCurrent(FDC, 0);

Я здесь смотрел: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wing… createcontext
Там wglMakeCurrent (NULL, NULL);
> Не факт что он именно линии рисует, а не трианглы.

Т.е. треугольники у которых 2 одинаковых вершины? Кстати, у меня вершина линии это (X,Y), Z как я понимаю = 0.
ЗЫ. Тормоза остались...
#36
(Правка: 14:56) 11:49, 15 сен. 2020

greencad
> Я здесь смотрел:
А еще там же написано что надо ставить cColorBits:= 24; cDepthBits:= 32; хотя такого формата в природе не существует. И если попадается то весьма редко поддерживается.
https://www.gamedev.ru/community/ogl/articles/multithreading
greencad
> 2 одинаковых вершины?
вместо линий рисуются прямоугольники.

Ты можешь без паттернов и прочего что осталось за кадром просто линии нарисовать в чистом виде? А то потом окажется что ты все это на виртуалке запускаешь.
https://www.youtube.com/watch?v=lwSiJIwc-Ng

Opengl_Lines_Test

+ GeForce GTS 450, glBegin glEnd 160 fps 6-7 mc

Если сравнивать с бенчмарками, в худшем случае у тебя должно быть 80 fps, 12-14 mc.

VBO на моем железе выдает тоже самое 160 fps, из них 0.4 мс приходиться на все кроме отрисовки линий (glBegin glEnd glDrawArrays).

Cheb
> Я уже забыл почему, но после долгих экспериментирований стал передавать 0.
ChoosePixelFormat выбирает из имеющихся форматов подходящий в твоем случае берется формат пикселей рабочего стола.

#37
14:54, 15 сен. 2020

greencad
Ну убери из шейдера все, кроме gl_FragColor = vec4(VertexColor, 1.0); и посмотри, что будет. Какая скорость.

#38
(Правка: 15:06) 15:02, 15 сен. 2020

Suslik
> , то самому написать нормальный вершинный шейдер вместо ffp.
Я пишу и отлаживаю свой движок на Intel HD 3000. Когда ещё использовал ffp - при достижении ~25 тыс. вершин в сцене резко начинались тормоза, всё умирало.
Однозначно неэффективная реализация говн мамонта в драйвере - на отвяжись.
Потому что, например, достаточно современная Spintires Mudrunner на той же недовидяхе нормально бегает - а там поросший густым лесом реалистичный ландшафт в квадратные километры.
А третий квейк, наоборот, тянет со скрипом.

Совет: построй график времени от числа линий и посмотри, нет ли на ём откровенных нелинейностей.

>ChoosePixelFormat выбирает из имеющихся форматов подходящий в твоем случае берется формат пикселей рабочего стола.
О, точно! Она обламывалась, если указать не совпадающий (в виндовс икспи выбрано 16 бит у рабочего стола, указываешь 32 - суши вёсла, неудача)

#39
(Правка: 15:17) 15:11, 15 сен. 2020

Cheb
> при достижении ~25 тыс. вершин в сцене резко начинались тормоза, всё умирало.
Именно в сцене, а не в отдельном буфере? Разница была если делать два раза по 10к? Может там лимит буфера/кеша на 16384.

Cheb
> в виндовс икспи выбрано 16 бит у рабочего стола, указываешь 32 - суши вёсла,
> неудача
Тоже самое если ты меняешь разрешение в полноэкранном режиме на какой нибудь 16,24,32

#40
15:51, 15 сен. 2020

foxes

> Opengl_Lines_Test

Сделал. Результаты: в четверть экрана - "fps 41 24ms", на полный экран - "fps 22 45ms".
> в худшем случае у тебя должно быть 80 fps, 12-14 mc.

А у меня хуже :)
HolyDel
> Ну убери из шейдера все

Дак выключил я его, т.е. создал и выключил glUseProgram(0); А тормоза остались.
#41
(Правка: 18:38) 16:09, 15 сен. 2020

greencad
> А у меня хуже :)
Не судьба. В архикаде длнинные линии? Может быть так что на экран не все из них выводятся.

Если строчки поправить, сильно FPS измениться?

    glVertex3d(Random(100)*0.004-2.0, Random(100)*0.002-1.0,0.0);
    glVertex3d(Random(100)*0.004-2.0, Random(100)*0.002-1.0,0.0);

В общем твоя проблема производительности касается полностью геометрии которую ты выводишь, ее масштаба на экране и форме, остальное тебе даст +-0.1 мс. Но так же не исключена проблема с дравами.

#42
19:46, 15 сен. 2020

foxes

> Не судьба

Да шустрый AutoCAD покоя не дает. Он летает, я торможу; где собака порылась...
И главное, с VAO/VBO и с glBegin/glEnd тормоза одинаковые.
> Может быть так что на экран не все из них выводятся.

И в AutoCAD и в своем маленьком тестовом приложении делаю так, чтобы квадрат, заполненный линиями были полностью видны на экране.
Может я панорамирование не так делаю?
У меня режим орто, ставлю так (в OnResize):
  FWinWidth:= FPanelWidth * 25.4 / FPPI;
  FWinHeight:= FPanelHeight * 25.4 / FPPI;

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(-FWinWidth / 2.0, FWinWidth / 2.0, -FWinHeight / 2.0, FWinHeight / 2.0, -1.0, 1.0);
  glViewport(0, 0, FPanelWidth, FPanelHeight);
  glMatrixMode(GL_MODELVIEW);
Обрабатываю MouseMove как в посте 28, ну а перед выводом линий ставлю это:
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glScalef(FScale, FScale, 1.0);
  glTranslatef(FPanX, FPanY, 0.0);
Вроде криминала нету... Сделал уже несколько тестовых приложений, пока без результата. В общем, здесь https://yadi.sk/d/r4Xitaoof_8lMA исходник и exe GLLinesTest3 одного из тестовых приложений. Ежели кто посмотрит, вдруг собака и найдется.
#43
(Правка: 21:19) 20:25, 15 сен. 2020

greencad
> Да шустрый AutoCAD покоя не дает.
Как ты определил что он шустрее? Фрапсом мерил? Там кадр обновляется только при скролинге, и то не факт что это не буфер с уже отрисованной геометрией. 24 кадра уже нормально.

Знаешь как в Windows перерисовываются окна? Они не отрисовываются целиком, а только та часть которая меняется, при помощи GetUpdateRgn. То что рисует AutoCAD внутри Frame со скролом это Plane которая частично перерисовывается, если это так, попробуй скролить сразу целый экран за раз и увидишь такие же тормоза.

greencad
> У меня режим орто
Зачем тебе gluUnProject?

#44
23:34, 15 сен. 2020

greencad
кратко о твоей проблеме, забудь про GL_LINES.

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика