OpenGL, применяя текстуру от изображения к изоповерхности - PullRequest
3 голосов
/ 03 ноября 2010

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

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

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

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

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

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

Есть ли способ сделать это эффективно, и если да, то что? Если нет, у кого-нибудь есть идея лучшего способа обработки текстур тома?

Редактировать : Отметим, что текстура - это не просто градиент цветов. Это на самом деле текстура, обычно с узорами. Отсюда и сложность его отображения, градиент был бы тривиальным.

Редактировать 2: Чтобы прояснить проблему, я собираюсь добавить несколько примеров. Они могут просто запутать вещи, поэтому примите во внимание все выше определенного факта, и это просто помощь, если они могут.

Моя геометрия всегда в кубах (загружается, генерируется и сохраняется в кубах). Если форма влияет на возможные решения, вот и все.

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

Шейдеры - это быстрое и простое решение, хотя я хотел бы избежать их, если это возможно, как я упоминал ранее. Что-то пригодное для использования в конвейере с фиксированными функциями предпочтительнее, в основном для небольшого увеличения совместимости и времени разработки. Поскольку это незначительное увеличение, я буду использовать шейдеры и многопроходный рендеринг, если необходимо.

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

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

По части сочетания текстур вопроса:

Вы смотрели на 3d текстуры?Поскольку мы говорим о марширующих кубах, я, вероятно, должен сразу сказать, что я явно не говорю о объемных текстурах.Вместо этого вы складываете все свои 2d текстуры в 3d текстуру.Затем вы кодируете каждую текстурную координату, чтобы она была 2-й позицией, а текстура - третьей.Это работает лучше всего, если ваши текстуры, как правило, относятся к тому типу, где, по логике, для перехода от одного типа шаблона к другому вам нужно пройти через посредников.

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

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

В части координат:

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

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

1 голос
/ 04 ноября 2010

Это сложная и интересная проблема.

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

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

0 голосов
/ 07 ноября 2010

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

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

0 голосов
/ 03 ноября 2010

Возможно, вы захотите сделать UV-карту сетки в таком инструменте, как Blender, чтобы увидеть, как они это делают. Если я понимаю вашу проблему, у вас есть 3D-поле, которое определяет сплошной объем, а также (непрерывный) цвет. Вы создали сетку из объема, и теперь вам нужно нанести UV-карту сетки на 2D-текстуру с текселями, выделенными из непрерывного цветового пространства. В инструменте вы определяете «швы» в трехмерной сетке, которые вы можете разрезать так, чтобы вся сетка могла быть плоской для создания УФ-карты. В швах может быть наложение текстуры в швах, поэтому при рендеринге сетки она также будет прерывистой в этих швах (т. Е. Треугольная полоса не может пересекать шов, потому что это разрыв в текстуре).

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

...