Реализация алгоритма уровня детализации для OpenGL
Я пытаюсь реализовать следующий алгоритм (переход от рисования к маленьким треугольникам), но я не смог найти в сети ни одного учебника, который бы объяснял это должным образом. Большинство вещей, которые я нашел, объясняют это теоретически, и примеры слишком сложно понять, так как они содержат много других вещей.
Если вы можете указать мне, как это делается или что-то подобное, я был бы более чем благодарен.
1 ответ
Из вашего комментария видно, что вы вызываете glVertex миллион раз, что означает, что вы используете устаревшие функции OpenGL, и, вероятно, именно поэтому ваша программа работает так медленно.
В свое время (не то, чтобы я действительно знал, мне 20), вы определяете вершины, используя glVertex, по одной за раз, один раз за кадр. Это называется немедленным режимом. Это передает информацию о вершине в память OpenGL (обычно графическую карту) один раз на вершину на кадр. Так что, если у вас есть 200 тыс. Вершин, как вы сказали, вы делаете это как минимум 200 тыс. Раз за кадр (вы можете сократить его до ровно 200 тыс., Если используете индексы, но затем вам нужно передать некоторые другие вещи).
Я сомневаюсь, что все эти вершины меняются каждый кадр. Держу пари, что многие или даже все они остаются одинаковыми на протяжении нескольких кадров. Итак, что вы можете сделать, это поместить их в нечто, называемое VBO (объект буфера вершин), что означает, что вы сохраняете всю эту информацию о вершинах в памяти OpenGL (опять же, вероятно, карту gfx, если она у вас есть), а затем вы не ' нужно передавать все эти вещи в каждом кадре.
Поначалу сложно обхватить голову. Но по сути, миллион раз вызывать glVertex - это все равно, что произносить каждый кадр: "Вот куча информации, которую мне нужно, чтобы вы нарисовали". И вы говорите то же самое каждый кадр. Использование буфера вершин Объекты подобны тому, чтобы сказать это один раз: "Вот куча информации", а затем сказать это один раз за кадр: "Помните ту информацию, которую я дал вам некоторое время назад? Нарисуйте ее".
Это, очевидно, намного быстрее, потому что вам не нужно передавать информацию каждый кадр.
Недостатком является то, что если вам нужно изменить вершины, это немного сложнее, потому что данные больше не контролируются вами. В этом случае вам нужно будет получить карту памяти для содержимого vbo и изменить ее, а не передавать новые данные. Или вы всегда можете удалить его и восстановить его, но если вы делаете это каждый кадр, то нет смысла использовать vbo в непосредственном режиме.
Я не буду публиковать какой-либо код, касающийся VBO, потому что тогда этот пост будет в 4 раза длиннее, чем он есть. Я думаю, что я дал вам много ключевых слов, которые вы можете Google, чтобы узнать больше информации. Вот некоторые из них, которые я бы предложил начать с изучения предмета (ищите их отдельно):
объекты буфера вершин, индексы, конвейер с фиксированными функциями, шейдеры
Если у вас возникнут проблемы с реализацией какого-либо из упомянутых мной материалов, я предлагаю вам открыть новый конкретный вопрос.
Удачи!