Эффективный способ преобразования 2D-растрового изображения в 3D-модель куба? - PullRequest
4 голосов
/ 04 декабря 2010

Я хочу создать модель куба растрового изображения 32x32 в opengl. Например, результат должен выглядеть примерно так с учетом двумерного растрового изображения Боб-омба из Super Mario: http://fc02.deviantart.net/fs49/f/2009/186/f/a/Bob_omb_in_Minecraft_by_Luafox.png Идея состоит в том, чтобы представить каждый двухмерный пиксель растрового изображения в виде трехмерного куба.

Каждая модель будет представлять врага в игре, поэтому мне нужно быстро их отрендерить. Что было бы хорошим способом сделать это?

Одна попытка, которую я предпринял, состоит в том, чтобы создать статическую трехмерную модель из растрового изображения, сначала создав сетку вершин 32x32x2, а затем создавая треугольники из этих вершин в соответствующих местах для формирования граней куба. Одна большая проблема, которую я имею, состоит в том, как сохранить цвета и нормали для лиц. Треугольники каждой грани должны иметь общую вершину, и эта общая вершина должна хранить цвет и нормали для этой грани. Однако я не думаю, что у меня достаточно вершин для каждого лица, чтобы иметь соответствующий цвет и нормаль. Я не могу придумать элегантный способ решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Вы будете быстрее, если вы визуализируете переднюю грань в виде GL_QUAD с одной текстурой, используя альфа и GL_ALPHA_TEST для «прозрачных» частей. Затем вы устанавливаете границу, то есть не фронтальные квадраты, как один или несколько GL_QUAD_STRIP.

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

0 голосов
/ 06 декабря 2010

Просто подсказка о том, как вы можете найти некоторые интересные чтения по этому поводу: ищите «воксель».http://en.wikipedia.org/wiki/Voxel

Может быть, вы хотели бы взглянуть на исходный код игровых движков с открытым исходным кодом Cube / Sauerbraten, которые основаны на подразделении кубов для карт и поставляются с хорошим внутриигровым редактором: http://sauerbraten.org/

0 голосов
/ 06 декабря 2010

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

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

edit: Это не значит, что вам нужно иметь отдельные вершины для каждого угла каждого грани каждого куба. На самом деле, самый дешевый способ визуализации того, что вы хотите (пока блоки вместе) с достаточно простой реализацией, вероятно, состоит в том, чтобы визуализировать переднюю и заднюю части каждого в виде двух треугольников, используя текстуру для цвета, GL_MAG_FILTER, GL_NEAREST выборку и тщательное выравнивание координаты текстуры, используя пиксельный шейдер для обрезки прозрачных текселей.

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

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

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