2010-11-03 5 views
3

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

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

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

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

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

Чтобы построить поверхности, я использую Visualization Library для OpenGL и его маршевых кубов и системы громкости. У меня есть геометрия, созданная отлично, просто нужно выяснить, как ее текстурировать.

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

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

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

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

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

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

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

ответ

0

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

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

0

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

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

+0

«Сетка сетки» на самом деле довольно хорошо изучена (и да, ее можно рассматривать как проблему минимизации энергии); см. мои ответы на конформные сопоставления. – timday

+0

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

+0

Вы не можете избежать поплавков в шейдере, но вы можете упаковать 24 бита целочисленных данных (мантиссы) в каждый поплавок, и каждый атрибут может иметь vec4 float. –

2

На комбинированной текстуры части вопроса:

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

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

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

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

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

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

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

+0

Библиотека, которую я использую для генерации геометрии, предоставляет методы для генерации нормалей, так что звучит так, как будто она может работать, если я могу эффективно их отображать. Ваше предложение укладки текстур также интригует, определенно не то, что я считал, но похоже, что это будет работать очень хорошо. Единственный недостаток - работать со слоистыми текстурами, но пришло время обновить Photoshop. : p Я обязательно попробую это. – ssube

1

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

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

Сложный способ смотреть на различные алгоритмы для conformal texture mapping (также известного как conformal surface parametrization), которые направлены для создания отображения между пространством текстуры 2D и поверхностью 3D геометрии, которая является в некотором смысле оптимального (мере искажения). У этого paper есть несколько хороших фотографий. Имейте в виду, что топология геометрии очень важна; легко создать конформное отображение, чтобы нанести текстуру на закрытую поверхность, как мозг, значительно более сложную для более высоких объектов genus, где необходимо ввести разрезы/слезы/соединения.

+0

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

Смежные вопросы