отображение текстуры трапеции с квадратной текстурой в OpenGL - PullRequest
9 голосов
/ 05 мая 2011

Я пытался визуализировать GL_QUAD (который имеет форму трапеции) с квадратной текстурой. Я хотел бы попробовать использовать OpenGL только для этого. Сейчас текстура сильно искажается, и это действительно раздражает.

Обычно, я бы загружал текстуру, вычислял гомографию, но это требовало много работы и дополнительной библиотеки линейного программирования / функции прямого линейного преобразования. У меня сложилось впечатление, что OpenGL может упростить этот процесс для меня.

Я посмотрел в Интернете и увидел "Перспективно-корректное текстурирование, Q-координаты и GLSL" и "Перекошенное / сдвиговое наложение текстур в OpenGL" .

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

Обновление:

Я читал «Навигация в статических средах с использованием упрощения пространства изображений и морфинга» [ PDF ] - стр. 9, приложение A.

Похоже, что они отключают коррекцию перспективы, умножая координату текстуры (s, t, r, q) на вершину компонента z мирового пространства модели.

То есть для заданной координаты текстуры (s, r, t, q) для квадрата, имеющего форму трапеции, где 4 компонента имеют вид:

(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f) 

Это так же просто, как и glTexCoord4f (s vert.z, r vert.z, t, q * vert.z)? Или я пропускаю какой-то шаг? как возиться с GL_TEXTURE glMatrixMode?

Обновление № 2:

Это добилось цели! Имейте это в виду, ребята, эта проблема во всем Интернете, и не было никаких простых ответов. Большинство из них связаны с непосредственным пересчетом текстуры с гомографией между исходной формой и преобразованной формой ... много линейной алгебры и внешней зависимостью BLAS lib.

Ответы [ 2 ]

11 голосов
/ 11 сентября 2011

Вот хорошее объяснение проблемы и ее решения.

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 для нижнего. Это создает неприятное изображение при отображении текстуры. </p>

Пространство текстур - это не просто 2D-аффинная плоскость, хотя мы обычно оставляем r = 0 и q = 1 по умолчанию. Это действительно полноценное проективное пространство (P3)! Это хорошо, потому что вместо указания координат текстуры для верхних вершин в виде (s, t) координат (0, 1) и (1, 1), мы можем указать их как (s, t, r, q) координат из (0, ширина, 0, ширина) и (ширина, ширина, 0, ширина)! Эти координаты соответствуют одному и тому же местоположению в текстурном изображении, но посмотрите на то, что случилось с ds / dx - теперь это одинаково для обоих треугольников !! Они оба имеют одинаковые dq / dx и dq / dy.

Обратите внимание, что он все еще находится в плоскости z = 0. Это может привести к путанице при использовании этой техники с перспективной проекцией камеры из-за «ложного восприятия глубины», которое она производит. Тем не менее, это может быть лучше, чем использовать только (s, t). Это вам решать.

0 голосов
/ 29 июня 2017

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

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

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

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

...