отображение текстуры трапеции с квадратной текстурой в OpenGL

StackOverflow https://stackoverflow.com/questions/5892120

  •  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). Это вам решать.

Другие советы

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

  1. перспективная проекция: трапеция выглядит как прямоугольник, если смотреть под косым углом.
  2. "эластичная" трансформация: трапеция выглядит как прямоугольный кусок резины, который был растянут / усажен до формы.

Большинство решений здесь, на SO, попадают в первую группу, тогда как я недавно оказался во второй.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top