отображение текстуры трапеции с квадратной текстурой в OpenGL
-
28-10-2019 - |
Вопрос
Я пытался визуализировать GL_QUAD (имеющий форму трапеции) с квадратной текстурой. Я хотел бы попробовать использовать OpenGL только для этого. Сейчас текстура сильно искажается, и это очень раздражает.
Обычно я загружаю текстуру, чтобы вычислить гомографию, но это означает много работы и дополнительную библиотеку линейного программирования / функцию прямого линейного преобразования. Мне кажется, что OpenGL может упростить мне этот процесс.
Я поискал в Интернете и увидел "Перспектива -Корректное текстурирование, координаты Q и GLSL " и «Сопоставление смещенной / срезанной текстуры в OpenGL» .
Похоже, все они предполагают, что вы будете выполнять какие-то вычисления гомографии или использовать некоторые части OpenGL, о которых я не знаю ... какие-либо советы?
< sizesUpdate:
Я читал «Навигация в статических средах с использованием изображений- Упрощение пространства и морфинг " [ PDF ] - стр. 9 приложение A.
Похоже, они отключают коррекцию перспективы, умножая координату текстуры (s, t, r, q) на вершину компонента z мирового пространства модели.
так для заданной координаты текстуры (s, r, t, q) для четырехугольника, имеющего форму трапеции, где 4 компонента:
родовое словоЭто так же просто, как glTexCoord4f (s vert.z, r vert.z, t, q * vert.z)? Или я пропустил какой-то шаг? нравится возиться с GL_TEXTURE glMatrixMode?
Обновление №2:
Это помогло! Имейте это в виду, ребята, эта проблема распространена по всей сети, и простых ответов не было. Большинство из них связано с прямым пересчетом текстуры с гомографией между исходной формой и преобразованной формой ... то есть много линейной алгебры и внешней зависимости BLAS lib.
Решение
Вот хорошее объяснение проблемы и ее решение.
http://www.xyzw.us/~cass/qcoord/
Частично скопировано и адаптировано из приведенной выше ссылки, созданной Cass
<цитата>Одним из наиболее интересных аспектов наложения текстуры является пространство, в котором находятся координаты текстуры. Большинству из нас нравится думать о пространстве текстуры как о простой аффинной 2D-плоскости. В большинстве случаев это вполне приемлемо и интуитивно понятно, но бывают случаи, когда это становится проблематичным.
Например, предположим, что у вас есть четырехугольник, имеющий трапециевидную форму в своих пространственных координатах, но квадратный в координатах текстуры.
OpenGL разделит квадрат на треугольники и вычислит наклон координат текстуры (ds / dx, ds / dy, dt / dx, dt / dy) и будет использовать их для интерполяции координаты текстуры по внутренней части многоугольника. Для нижнего левого треугольника dx= 1 и ds= 1, но для верхнего правого треугольника dx <1, а ds= 1. Это делает ds / dx для верхнего правого треугольника больше, чем ds / dx для нижнего. Это создает неприятное изображение при наложении текстуры.
Текстурное пространство - это не просто двухмерная аффинная плоскость, хотя обычно мы оставляем только значения по умолчанию r= 0 и q= 1. Это действительно полное проективное пространство (P3)! Это хорошо, потому что вместо того, чтобы указывать координаты текстуры для верхних вершин как (s, t) координаты (0, 1) и (1, 1), мы можем указать их как (s, t, r, q) координаты of (0, width, 0, width) и (width, width, 0, width)! Эти координаты соответствуют одному и тому же месту на изображении текстуры, но ПОСМОТРИТЕ, что случилось с ds / dx - теперь оно одинаково для обоих треугольников !! У них обоих одинаковые dq / dx и dq / dy.
Обратите внимание, что он все еще находится в плоскости z= 0. Использование этого метода с проекцией перспективной камеры может вызвать затруднения из-за «ложного восприятия глубины», которое при этом создается. Тем не менее, это может быть лучше, чем использование только (s, t). Это вам решать.
Другие советы
Я полагаю, что большинство людей, желающих разместить прямоугольную текстуру на трапеции, думают об одном из двух результатов:
- перспективная проекция: трапеция выглядит как прямоугольник, если смотреть под косым углом.
- "эластичная" трансформация: трапеция выглядит как прямоугольный кусок резины, который был растянут / усажен до формы.
Большинство решений здесь, на SO, попадают в первую группу, тогда как я недавно оказался во второй.
Самый простой способ добиться эффекта 2 - разделить трапецию на прямоугольник и прямоугольные треугольники.В моем случае трапеция была правильной, поэтому четырехугольник и два треугольника решили проблему.