Визуализация вершин Directx: невозможно получить правильное отображение текстуры для трапецоидов - PullRequest
2 голосов
/ 09 февраля 2011

Я пытаюсь создать трехмерный эффект, используя буферы вершин и индексов в 2d (координата z равна 0), используя DirectX7.

Это проще объяснить с помощью картинки:

Problem's illustration

Проблема в том, что строки разбиты.Они должны быть прямыми.Чтобы визуализировать это изображение, оно разбивается на треугольники и отображается с использованием DrawIndexedPrimitiveVB.Очевидно, что каждый треугольник искажен немного по-разному, и я не понимаю, почему.

Я что-то упускаю здесь тривиально?

Я не уверен, поможет ли это, но источники четыре пункта назначения следующие:

    SPoint4:= pBounds4(1, 1, W - 2, H - 2);
    DPoint4:= Point4(ProjTo2dX(i, FlyDist + DeepDist, W), ProjTo2dY(0, FlyDist + DeepDist, H), ProjTo2dX(W - i, FlyDist, W), ProjTo2dY(0, FlyDist, H), ProjTo2dX(W - i, FlyDist, W), ProjTo2dY(H, FlyDist, H), ProjTo2dX(i, FlyDist + DeepDist, W), ProjTo2dY(H, FlyDist + DeepDist, H));

Ответы [ 3 ]

3 голосов
/ 26 мая 2012

Одним из способов сопоставления квадратной / прямоугольной текстуры с произвольным квадратом является проективная интерполяция. Я написал статью , показывающую, как это сделать (используя вершинные / пиксельные шейдеры).

Короткая версия: вы интерполируете ультрафиолетовые лучи по всему четырехугольнику способом, аналогичным тому, как это делают графические процессоры для корректного рендеринга (что, как вы могли заметить, не создает видимый шов между два треугольника). Чтобы сделать это, вам нужно вычислить ложное значение «глубины» для каждой вершины четырехугольника и выполнить интерполяцию, используя однородные координаты, основанные на этой «глубине». Полную информацию можно найти в статье, указанной выше.

1 голос
/ 09 февраля 2011

Вам необходимо предоставить некоторую информацию о перспективе, чтобы иметь правильную интерполяцию координат текстуры на трапеции, см.

Проблемы с деформацией текстуры в OpenGL ES 1.1 на четырехугольнике из треугольных полос

0 голосов
/ 09 февраля 2011

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

less broken lines

в этом случае изображение делится на 10 полос (20 треугольников).

Буду рад любым комментариям или другим решениям. Спасибо.

...