отображение текстуры трапеции с квадратной текстурой в 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, rvert.z, t, q * vert.z)? Или я пропустил некоторые шаг? как возиться с GL_TEXTURE glMatrixMode?

обновление #2:

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

2 ответов


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

http://www.xyzw.us / ~cass / qcoord/

частично скопирована и адаптирована сверху ссылка, созданная КАС

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

например, предположим, что у вас есть квадроцикл, трапециевидный в своих пространственных координатах, но квадратный в своих текстурных координатах.

OpenGL разделит quad на треугольники и вычислит наклоны координат текстуры (ds/dx, ds/dy, dt/dx, dt/dy) и использует их для интерполяции координаты текстуры по внутренней части многоугольника. Для нижнего левого треугольника dx = 1 и ds = 1, но для верхнего правого треугольник, dx

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

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


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

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

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

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