Suslik
Так вроде достаточно 1 вектор (H) на треугольник.
Про u- я, похоже, косячу. Там на знак смотреть надо.
Забавно то, что если эти формулы вбить "как есть", они могут очень плохо себя вести (численно) на весьма безобидных, по здравому размышлению, данных.
Интересно сделать чтобы работало надёжно.
Даже если найти решение для квада, лента будет ломаться на состыковках квадов.
Может стоит пересмотреть условия задачи?
Suslik
> strip texturing
Тред не читал. Стрип текстуры можно зафотать в стрип баре.
FordPerfect
> Забавно то, что если эти формулы вбить "как есть", они могут очень плохо себя
> вести (численно) на весьма безобидных, по здравому размышлению, данных.
> Интересно сделать чтобы работало надёжно.
именно такие впечатления у меня остались с последнего раза, когда я их реализовывал лет 10 назад. писал софтварный рендер для квадов. не спрашивайте.
Mikle
> Даже если найти решение для квада, лента будет ломаться на состыковках квадов.
да, всё так. но эти сломы всё равно менее заметны, чем сломы внутри квадов. задача-то исходная формулируется примерно так:
дана линия, состоящая из последовательно заданных точек. требуется вдоль неё нарисовать длинную текстурированную полоску.
*Lain*
> Тред не читал. Стрип текстуры можно зафотать в стрип баре.
я слышал, кстати, в бане тоже можно нормально набрать. не сходишь посмотреть?
Suslik
> дана линия, состоящая из последовательно заданных точек. требуется вдоль неё
> нарисовать длинную текстурированную полоску.
Ширина полоски фиксирована? Есть предельный угол, острее которого изломов не будет?
А то ведь это можно решить и сплайном, прямо в шейдере.
Suslik
> дана линия, состоящая из последовательно заданных точек. требуется вдоль неё
> нарисовать длинную текстурированную полоску
Для выпуклого четырёхугольника существует аналитическое решение для вычисления текстурных координат, на основе него
ещё при царе горохе в некоторых играх делали декали для изогнутых дорог на ландшафте.
На шейдерах в 2d это в разы проще, так как нет нужды дополнительно триангулировать квады под особенности ландшафта
и для минимизации изломов текстуры на стыках треугольников.
Mikle
ширина фиксирована, сумасшедших поворотов обычно нет. как ты предлагаешь это решать в шейдере?
Hybernaculum
рекомендую почитать тред, хотя бы пару первых постов.
Suslik
> рекомендую почитать тред, хотя бы пару первых постов.
Аналитическое решение для выпуклого четырёхугольника как раз и обеспечивает линейность вдоль каждой из сторон квада, чем оно вам не угодило ?
Кстати, в гугле по очевидным ключевым словам можно найти страничку некого испанского программиста, там есть вся математика (весьма простая
в векторном виде, самое "страшное" это вычисление одного квадратного корня от одного числа для пары u/v) и рабочий пример на шейдерах.
Hybernaculum
ты тред-то всё-таки почитай, вдруг там написано чего?
Suslik
> как ты предлагаешь это решать в шейдере?
В геометрическом.
А какая типичная длина ленты (в узловых точках)?
Mikle
не, у меня d3d9 feature level, как-нибудь без геометрических шейдеров. полоска очень длинная, несколько десятков тысяч пикселей. ширина — около 20-50.
Suslik
> ты тред-то всё-таки почитай, вдруг там написано чего?
Не беспокойтесь, тред я читал. Вот тут вы пишите что у вас проблемы с аналитическим решением для квадов. )))
То есть если найти такие коэффициенты uv преобразования для вершин вида lerp(lerp(a, b, u), (c, d, u), v) = p, то они и будут ответом. Но это — квадратное уравнение и я всё ещё не помню, как выбирал нужный корень.
Когда решите эту проблему, можно будет двигаться дальше, например построить эти квады вдоль сплайна, посчитанным с фиксированным шагом по заданным точкам полоски, чтобы в местах изломов квадов было больше.
Suslik
Накидал пример.
Формат вершины у меня вот такой (добавился всего лишь один флоат в текстурные координаты):
struct VS_Input {
float2 vsPos : vsPos;
float3 vsTex : vsTex;
};Заполняю данным как-то так (в точности как в посте #8 я описывал):
Пиксельный шейдер такой:
PS_Output PS(VS_Output In) { PS_Output Out; In.Tex.x /= In.Tex.z; Out.Color = Map.Sample( MapSampler, In.Tex.xy); return Out; }
Результат вот такой:
т.е. частный случай с трапециями решается крайне просто.
Suslik
Где-то вроде такого:
Народ, проверите?
Там проверку L0≈0 наверно можно более здраво сделать.
Ну и вычислять 2-й коэффициент, видимо, можно из первого, без корня - если понять, который из них лучше считается.
Поправил код:
< // Inside convex quadrilateral d>0 should hold, absent round-off. > // Absent round-off, d>=0 should hold inside convex quadrilateral. < // The denominator is only zero, when a, b, and c are all very close to zero. > // The denominator is only zero, when b, and a*c are both zero.
Ещё есть случай угла 180 (реально треугольник), тоже интересный.
Тема в архиве.