реализация алгоритма уровня детализации для OpenGL - PullRequest
2 голосов
/ 02 декабря 2011

Я пытаюсь реализовать следующий алгоритм (переход от рисования к маленьким треугольникам), но я не смог найти в сети ни одного учебника, который бы объяснял это правильно. Большинство вещей, которые я нашел, объясняют это теоретически и примерыслишком сложны для понимания, потому что они содержат много других вещей.

Если вы можете указать мне, как это делается или что-то в этом роде, я был бы более чем благодарен.

1 Ответ

4 голосов
/ 02 декабря 2011

Из вашего комментария похоже, что вы вызываете glVertex миллион раз, что означает, что вы используете устаревшие функции OpenGL, и, вероятно, поэтому ваша программа работает так медленно.

Назад в тот день (нечто я действительно знаю, мне 20), вы определяете вершины, используя glVertex, по одному за раз, на кадр.Это называется немедленным режимом.Это передает информацию о вершине в память OpenGL (обычно графическую карту) один раз на вершину на кадр.Так что, если у вас есть 200 тыс. Вершин, как вы сказали, вы делаете это как минимум 200 тыс. Раз за кадр (вы можете сократить его до ровно 200 тыс., Если используете индексы, но затем вам нужно передать некоторые другие вещи).

Я сомневаюсь, что все эти вершины меняются каждый кадр.Могу поспорить, что многие или даже все они остаются одинаковыми на протяжении нескольких кадров.Итак, что вы можете сделать, это поместить их в нечто, называемое VBO (объект буфера вершин), что означает, что вы сохраняете всю эту информацию о вершинах в памяти OpenGL (опять же, вероятно, карту gfx, если она у вас есть), а затем вы не 'нужно передавать все эти вещи в каждом кадре.

Поначалу сложно обернуть голову.Но, по сути, миллион раз вызывать glVertex - это все равно что произносить каждый кадр: «Вот куча информации, которую мне нужно, чтобы вы нарисовали»И вы говорите то же самое каждый кадр.Использование буфера вершин Объекты подобны тому, чтобы сказать это один раз: «Вот куча информации», а затем сказать это один раз за кадр: «Помните ту информацию, которую я дал вам некоторое время назад? Нарисуйте ее».

Это очевиднонамного быстрее, потому что вам не нужно передавать информацию каждый кадр.

Одним из недостатков является то, что если вам нужно изменить вершины, это немного сложнее, потому что данные больше не контролируются вами.В этом случае вам нужно будет получить карту памяти для содержимого vbo и изменить ее, а не передавать новые данные.Или вы всегда можете удалить его и восстановить его, но если вы делаете это каждый кадр, то нет смысла использовать vbo-ы в непосредственном режиме.

Я не буду публиковать какой-либо код относительно VBO, потому что тогда это сообщение получитВ 4 раза дольше чем уже есть.Я думаю, что я дал вам много ключевых слов, которые вы можете Google, чтобы узнать больше информации.Вот некоторые из них, которые я бы предложил начать с изучения предмета (ищите их отдельно):

объекты буфера вершин, индексы, конвейер фиксированных функций, шейдеры

Если у вас есть какие-либо проблемыреализуя все, что я упомянул, тогда я предлагаю вам открыть новый специфический вопрос.

Удачи!

...