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

Я пытался визуализировать 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 (svert.z, r vert.z, t, q * vert.z)? Или я пропускаю какой-то шаг? как возиться с GL_TEXTURE glMatrixMode?

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

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

2 ответа

Решение

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

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

Пространство текстуры - это не просто 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). Это вам решать.

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

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

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

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

Надеюсь, это может помочь: Цитата из статьи: "В каждом пикселе выполняется деление с использованием интерполированных значений (s=w; t=w; r=w; q=w), что дает (s=q; t=q), которые являются конечными координатами текстуры. Чтобы отключить этот эффект, что невозможно напрямую в OpenGL ".

В GLSL (по крайней мере, сейчас) это возможно. Можете добавить:

без перспективы vec4 v_TexCoord;

есть объяснение:https://www.geeks3d.com/20130514/opengl-interpolation-qualifiers-glsl-tutorial/

Другие вопросы по тегам