Деформируемая местность в OpenGL 2D [Worms like] - PullRequest
4 голосов
/ 04 октября 2011

Я искал некоторое время и слышал о разных способах сделать это, поэтому я подумал, что приду сюда и посмотрю, что мне следует делать,

Из того, что я собрал, яследует использовать .. glBitmap и значения 0s и 0xFF в массиве для создания ландшафта.Любой вклад в это?Я пытался переключить его на четырехугольники, но я не уверен, что это эффективно и как это должно было быть сделано.

Я хочу, чтобы на местности были туннели, такие как черви.2 Dimensional.

Вот то, что я пробовал до сих пор:

Я попытался создать карту glBitmap, поэтому ..

pixels = pow(2 * radius, 2);
ras = new GLubyte[pixels];

и затем установил ихвсе в 0xFF и нарисовали его используя glBitmap (x, y, 0, 0, ras);Это можно было бы затем проверить на наличие взрывов, а что нет и какие пиксели можно установить на ноль.Это правдоподобный подход?Я не слишком хорош с opengl, могу ли я поместить текстуру в glBitmap?Из того, что я видел, я не думаю, что ты можешь.

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

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

3 голосов
/ 04 октября 2011

ОК, это общий обзор, и я предполагаю, что вы уже знакомы с основами OpenGL, такими как буферные объекты.Дайте мне знать, если что-то не имеет смысла, или если вы хотите больше подробностей.


Наиболее распространенный способ представления ландшафта в компьютерной графике - это поле высоты: сетка точек, которые регулярно располагаютсяна осях X и Y, но чья Z (высота) может варьироваться.Поле высоты может иметь только одно значение Z на одну (X, Y) точку сетки, поэтому у вас не может быть «выступов» на местности, но, как правило, этого достаточно в любом случае.

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

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

Координаты для каждой вершины необходимо сохранить в буферном объекте, так какобычный.Когда вы вызываете glBufferData() для загрузки данных вершин в графический процессор, укажите параметр использовании либо GL_STREAM_DRAW, если местность обычно будет меняться от одного кадра к следующему, либо GL_DYNAMIC_DRAW, если это произойдетчасто меняются, но не (близко) к каждому кадру.Чтобы изменить местность, снова вызовите glBufferData(), чтобы скопировать другой набор данных вершин в графический процессор.

Для самих данных вершин можно указать все три координаты (X, Y и Z) для каждоговершина;это самая простая вещь.Или, если вы используете достаточно свежую версию GL и хотите быть изощренным, вы сможете вычислить координаты X и Y в вершинном шейдере, используя gl_VertexID и размеры сетки (переданные шейдеру какединообразное значение).Таким образом, вам нужно только сохранить значения Z в буфере, что означает меньше потребляемой памяти и пропускной способности графического процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...