У меня есть программа, в которой мне нужно применить двухмерную текстуру (простое изображение) к поверхности, сгенерированной с использованием алгоритма маршевых кубов. Я имею доступ к геометрии и могу добавить текстурные координаты с относительной легкостью, но лучший способ генерировать координаты ускользает от меня.OpenGL, применяя текстуру от изображения до isosurface
Каждая точка тома представляет собой единую единицу данных, и каждая единица данных может иметь разные свойства. Чтобы упростить ситуацию, я просматриваю их сортировку по типам и присваивая каждому типу текстуру (или часть одного большого атласа текстуры).
Моя проблема: я понятия не имею, как создать соответствующие координаты. Я могу сохранить расположение текстуры типа в классе типа и использовать его, но тогда швы будут ужасно растянуты (если две соседние точки используют разные части атласа). Если возможно, я бы хотел смешать текстуры на швах, но я не уверен, что это лучший способ сделать это. Смешивание необязательно, но мне нужно текстурировать вершины в некотором роде. Возможно, но нежелательно разбить геометрию на части для каждого типа или дублировать вершины для целей текстурирования.
Я хотел бы избежать использования шейдеров, если это возможно, но при необходимости я могу использовать шейдер вершин и/или фрагментов для смешивания текстур. Если я использую шейдеры, какой бы самый эффективный способ сказать это была текстура или часть образца? Похоже, что прохождение типа через параметр было бы самым простым способом, но возможно медленным.
Мои тома относительно малы, 8-16 точек в каждом измерении (я держу их меньше, чтобы ускорить создание, но на определенном времени их много). Я вкратце рассмотрел возможность сделать изоповерхность дважды разрешением объема, поэтому каждая точка имеет больше вершин (теоретически 8), что может упростить текстурирование. Не похоже, что это облегчило бы смешивание.
Чтобы построить поверхности, я использую Visualization Library для OpenGL и его маршевых кубов и системы громкости. У меня есть геометрия, созданная отлично, просто нужно выяснить, как ее текстурировать.
Есть ли способ сделать это эффективно, и если да, то что? Если нет, есть ли у кого-нибудь представление о лучшем способе обработки текстурирования тома?
Редактировать: Просто отметить, что текстура - это не просто градиент цветов. Это на самом деле текстура, обычно с узорами. Следовательно, трудности с отображением этого, градиент был бы тривиальным.
Редактировать 2: Чтобы помочь прояснить проблему, я собираюсь добавить несколько примеров. Они могут просто путать вещи, поэтому рассмотрите все выше определенного факта, и они так же помогут, если смогут.
Моя геометрия в кубах, всегда (загружена, сгенерирована и сохранена в кубах). Если форма влияет на возможные решения, вот и все.
Мне нужно применить текстуры, состоящие из узоров и/или цветов (уникальные в зависимости от типа «точки») к геометрии, в технике, подобной сплайтингу, сделанному для местности (это не рельеф, однако , поэтому я не знаю, можно ли использовать те же методы).
Шейдеры - это быстрое и простое решение, хотя я хотел бы избежать их, если это возможно, как я уже говорил. Что-то полезное в конвейере с фиксированной функцией предпочтительнее, в основном для незначительного увеличения совместимости и времени разработки. Поскольку это лишь незначительное увеличение, я пошлю с шейдерами и многопроходным рендерингом, если это необходимо.
Не уверен, что какие-либо другие пояснения необходимы, но я обновлю вопрос по мере необходимости.
«Сетка сетки» на самом деле довольно хорошо изучена (и да, ее можно рассматривать как проблему минимизации энергии); см. мои ответы на конформные сопоставления. – timday
Я не уверен, правильно ли сформулировал свою проблему. У меня есть том, да, с которого я генерирую геометрию. Тем не менее, мне нужно (хотя этот термин может и не быть точным здесь) splat различные 2d текстуры на эту геометрию, основываясь на свойствах поверхности. Эти свойства в настоящий момент не хранятся в геометрии или текстуре тома. Я мог бы добавить их каким-то образом, но их хранят как целые числа прямо сейчас, и я не могу придумать простой способ пакетного преобразования в вершины, чтобы шейдеры могли читать их обратно, не проходя через поплавки на этом пути. – ssube
Вы не можете избежать поплавков в шейдере, но вы можете упаковать 24 бита целочисленных данных (мантиссы) в каждый поплавок, и каждый атрибут может иметь vec4 float. –