На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Меняем вершинный буфер. , Можно ли оптимизировать?
    Здравствуйте.

    Использую Opengl последних версий, программирую на Delphi. Рисую данные, используя один вершинный буфер. И вот нужно мне на лету поменять буфер. Делаю следующее:

    {a} glDisableVertexAttribArray(g_vertexLocation);
    {b} glBindBuffer(GL_ARRAY_BUFFER, g_vertices_2);
    {c} glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, false, 0, 0);
    {d} glEnableVertexAttribArray(g_vertexLocation);


    Всё прекрасно рисуется с новым буфером g_vertices_2. До этого рисовал буфер g_vertices_1, который тоже вначале был
    связан с шейдерной переменной g_vertexLocation с помощью

    {1} glBindBuffer(GL_ARRAY_BUFFER, g_vertices_1);
    {2} glVertexAttribPointer(g_vertexLocation, 4, GL_FLOAT, false, 0, 0);
    {3} glEnableVertexAttribArray(g_vertexLocation);


    Потому и возникает вопрос: нужно ли снова вызывать строку {c} кода или достаточно только {d}? И вообще где реально происходит
    связывание нового буфера с соответствующей шейдерной переменной? Уже обнаружил, что всё будет работать и без строчки {a}.
    Но хотелось бы знать как надо по науке?
      Ещё вопрос новичка. Вот создали мы много GL_ARRAY_BUFFER буфферов, наполнили их данными. А с переменными вершинного шейдера связали только несколько из них.
      Что происходит в процессе glDraw... с остальными вершинными буферами, которые не связаны ни с какими переменными вершинного шейдера?
      Надеюсь они не передаются в конвейере (без какого либо действия, просто в потоке), также как и задействованные буферы? Было бы странно конечно.

      Просто слышал, но возможно неправильно понял, что ВСЕ буфферы связанные с текущим VAO будут участвовать в конвейере, даже вхолостую,
      если шейдер их не использует? Надеюсь неправда, так как даже и размеры у всех буфферов могут быть очень разные.
        Цитата
        Но хотелось бы знать как надо по науке?

        По науке, говорят, нужно сливать все данные в один буфер, ну или в два, статический и динамический.
        http://public.closedcircles.com/posts/gdc-...rhead-in-opengl
        Менее экстремальный вариант - манипуляции с VAO, если я правильно понял, использование своего VAO для каждого формата вершин быстрее, чем перенастройка одного.
        http://www.openglsuperbible.com/2013/12/09...ay-performance/
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0168 ]   [ 15 queries used ]   [ Generated: 5.05.24, 04:54 GMT ]