Отображение текстуры трапеции с квадратной текстурой в 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). Это вам решать.
Я предполагаю, что большинство людей, желающих разместить прямоугольную текстуру на трапеции, думают об одном из двух результатов:
- перспективная проекция: трапеция выглядит как прямоугольник, видимый под косым углом.
- "растягивающееся" преобразование: трапеция выглядит как прямоугольный кусок резины, который был растянут / сжат в форму.
Большинство решений здесь на 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/