Russian Qt Forum
Сентябрь 30, 2024, 14:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с текстурами в OpenGL  (Прочитано 5859 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Октябрь 16, 2011, 09:18 »

Добрый день

Общая задача поддерживать 2 и более текстур на 1 объекте со всеми типами и наворотами маппинга. (изначально приложение обходилось 1 текстурой).

Сделал так: создаю UV координаты для каждой текстуры и затем использую glTextImage2D и glTetCoordPointer.  Это работает, но возникает капитальнейший геморрой: UV seam (шов). Приходится "распиливать" полигоны по шву, с 2 и более текстурами это особенно неприятно.

Как-то "обойти" это дело не удается: объект может и не иметь своих UV, может иметь но пользователь их выключил, и/или UV(W) не плоские. В редакторе (для которого все это делается) пользователь назначает тип наложения и выбирает имедж текстуры, смещения и масштаб подбирает интерактивно. Все наложенные текстуры должны отображаться в окнах preview.

Возвращаясь к злополучному шву: есть ли лучшее ("модерновое") решение?

Спасибо
Записан
xop
Гость
« Ответ #1 : Октябрь 18, 2011, 11:45 »

Не совсем понятно зачем каждой текстуре свои текстурные координаты. Обычно используется одна развертка на все текстуры. Максимум две, в этом случае основые текстуры по прежнему по первой развертке кладутся, а вторая - для чего-нибудь типа лайтмапы. Соответственно швов немного Улыбающийся
« Последнее редактирование: Октябрь 18, 2011, 11:53 от xop » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 18, 2011, 12:19 »

Не совсем понятно зачем каждой текстуре свои текстурные координаты. Обычно используется одна развертка на все текстуры. Максимум две, в этом случае основые текстуры по прежнему по первой развертке кладутся, а вторая - для чего-нибудь типа лайтмапы. Соответственно швов немного Улыбающийся
Простой случай - (записанных) текстурных координат нет (ну такая у пользователя модель). Он хочет наложить напр одну текстуру сферой и еще одну flat'oм. Для меня объем работ точно такой же как если он использовал все 8 или больше - надо как-то создавать для каждой свое UV пр-во. Есть др. ходы - подскажите. Со швами то же самое: от того что их у пользователя немного, мне работы никак не меньше  Улыбающийся
Записан
xop
Гость
« Ответ #3 : Октябрь 18, 2011, 13:17 »

Если накладывать текстуры сферой или flatом - то вообще непонятно, откуда взяться швам. А текстурные координаты для таких случаев вообще можно (и обычно так и делают) в шейдере на лету генерить. А развертками - да, от швов обычно никуда не деться, и это обычно уже задача моделлеров оптимизировать развертку так, чтобы было меньше швов. И дублирование вершин в этом случае неизбежно, и является нормой. Ну, по крайней мере когда разверток одна-две - ни к чему плохому это не приводит. Или мы про разные "швы"? Можно конкретную картинку с конкретной проблемой шва и "распиливания" полигонов? Или хотя бы чертеж?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 18, 2011, 14:11 »

Если накладывать текстуры сферой или flatом - то вообще непонятно, откуда взяться швам. А текстурные координаты для таких случаев вообще можно (и обычно так и делают) в шейдере на лету генерить. А развертками - да, от швов обычно никуда не деться, и это обычно уже задача моделлеров оптимизировать развертку так, чтобы было меньше швов. И дублирование вершин в этом случае неизбежно, и является нормой. Ну, по крайней мере когда разверток одна-две - ни к чему плохому это не приводит. Или мы про разные "швы"? Можно конкретную картинку с конкретной проблемой шва и "распиливания" полигонов? Или хотя бы чертеж?
Об одних и тех же  Улыбающийся Да, я вынужден "расшарить" всех (каждый полигон ссылается на свои вертексы), иначе никак не протолкнуться с UV.. Сфера создает шов (в одном полигоне напр один вертекс мапируется на левую точку имеджа, а другой - на правую). Flat нет, но массивы-то должны сбиваться, поэтому я вынужден добавлять новую геометрию (образующуюся как результат "пиления") во все UV пр-ва. Генерирвать на ходу было бы замечательно т.к. именно это я и делаю в software - но увы, мне надо еще держать Gourand и Flat (тоже с текстурами но без шейдеров). Кстати я не нашел способа как сделать Flat кроме опять-таки "расшарить всех" для того чтобы симитировать полигонные нормали.

Ну ладно, нет так нет, значит вроде иду верным путем  Улыбающийся
Спасибо за информацию
Записан
xop
Гость
« Ответ #5 : Октябрь 18, 2011, 14:29 »

Gouraud и flat - это я так понимаю все то же самое, но на фиксированном функционале без использования шейдеров? И плоский и sphere-mapping аппаратно поддерживаются видюхами и очень давно, читайте спецификацию OpenGL 2.1 с 50 страницы (функции glTexGen). Так что это тоже можно на лету и без шейдеров.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 18, 2011, 16:57 »

Gouraud и flat - это я так понимаю все то же самое, но на фиксированном функционале без использования шейдеров? И плоский и sphere-mapping аппаратно поддерживаются видюхами и очень давно, читайте спецификацию OpenGL 2.1 с 50 страницы (функции glTexGen). Так что это тоже можно на лету и без шейдеров.
Читал и эту и другие - вот только не очень понял  Улыбающийся Везде изложение сразу же сваливается в reflection, но мне это не нужно, цель - текстура на геометрии (view-independent, с поведением UV). Есть ли такое в OpenGL? Также

- что делать с наложением цилиндром ?
- cubic вроде в OpenGL есть (натыкался), но у меня еще 2 урода: "angular" и "vertical cross". Какие к ним есть подходы?

Путь что я выбрал - трудоемкий и корявый, но он имеет тот плюс что выполняется однообразно для всех типов маппинга. Делать "по-всякому"  (в зависимости от возможностей OpenGL) дешевле не выходит. Как Вы считаете?

Спасибо
Записан
xop
Гость
« Ответ #7 : Октябрь 18, 2011, 17:21 »

Изложение сваливается в reflection, потому что эти маппинги делались в железе именно для фейковых отражений. В общем, сделать можно, как - надо разбираться. Насчет однообразного пути - уж лучше делать тогда все на шейдерах. Я серьезно. Держатся почти любым железом, какое сейчас есть. Если совсем все плохо и нужна поддержка старых intelовских карточек - можно использовать ARB-шейдеры - это ассемблер, но в него прекрасно компиляется нвидиевский cg.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 19, 2011, 17:29 »

Если совсем все плохо и нужна поддержка старых intelовских карточек - можно использовать ARB-шейдеры - это ассемблер, но в него прекрасно компиляется нвидиевский cg.
Ну так с пользователем не договаривались. Не получается загрузить шейдер - значит просто Gourand. Еще 2 вопроса по OpenGL текстурам

1) Такая ситуация иногда называется "implicit UV". Изначальных (специально подготовленных) UV нет, но есть возможность сохранить объектные координаты как UV. После этого объект напр. сплющен (или др. нелинейное действие). Но поскольку есть UV, текстура "плющится вместе с объектом" а не скользит. Можно ли OpenGL как-то подсунуть такие UV вместо вертексов? (напр для кубика)

2) Есть наложение "пирамидой" - вариация flat с той разницей что координаты умножаются на kz (где z - расстояние по Z до вершины пирамиды). Как это сделать в OpenGL?

Спасибо
Записан
xop
Гость
« Ответ #9 : Октябрь 19, 2011, 21:34 »

Ну так с пользователем не договаривались. Не получается загрузить шейдер - значит просто Gourand. Еще 2 вопроса по OpenGL текстурам
В смысле? Сейчас любое более-менее современное железо держит шейдеры (даже купленное в 2005). У старых интеловских карточек есть проблемы с поддержкой GLSL, но ARB-шейдеры они держат начиная кажется с 910 чипсета. Если надо их поддерживать - пишите на Cg (почти копия HLSL), компилируйте в ARB-ассемблер и используйте. Хоть на интеле, хоть на нвидии, хоть на амд/ати. На любом железе начиная кажется с 2003-2004 года выпуска.

1) Такая ситуация иногда называется "implicit UV". Изначальных (специально подготовленных) UV нет, но есть возможность сохранить объектные координаты как UV. После этого объект напр. сплющен (или др. нелинейное действие). Но поскольку есть UV, текстура "плющится вместе с объектом" а не скользит. Можно ли OpenGL как-то подсунуть такие UV вместо вертексов? (напр для кубика)
Да, можно. Указываете ваш сохраненный массив с координатами в качестве текстурных координат при отрисовке.

2) Есть наложение "пирамидой" - вариация flat с той разницей что координаты умножаются на kz (где z - расстояние по Z до вершины пирамиды). Как это сделать в OpenGL?
Легко в шейдере. Если без шейдеров - можно задавать матрицы 4x4 для преобразования текстурных координат. Дальше строите соответствующую матрицу преобразовния (матрица перспективной проекции очень похожее преобразование задает) и вперед.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.182 секунд. Запросов: 22.