|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alexei Frounze 2:5020/400 25 May 2001 09:37:00 To : Aleksey Malov Subject : текстурирование (сырэц) -------------------------------------------------------------------------------- Fri May 25 2001 02:01, Aleksey Malov wrote to Yuri Burger: AM> Вот в таком виде эхотаг текстурирования не видно совсем. Пользы от AM> ТАКОГО исходника на C не больше, чем от исходника на асме (разве что C - AM> межплатформенный язык). Правду говоришь. AM> Кстати. Учитывает ли народ то, что для корректной растеризации AM> треугольника надо обсчитывать по несколько различающимся формулам AM> смещения в экране и в текстуре по крутым и по пологим ребрам, а также AM> учитывать то, какй треуголльник - левосторонний или правосторонний (с AM> какой стороны находится средняя вершина). AM> Пример: AM> Заметно, что для ребра AB расчет смещения в экране по формуле AM> AB.step_x = (B.x - A.x)/(B.y - A.y) AM> не дает правильного результата (граница полигона не совпадает с контуром AM> полигона). Приходится использовать модифицированные формулы расчета для AM> "верхних" и "нижних" ребер. Кое-кто учитывает. Я, например. Во-первых, я преобразования (повороты и сдвиги) относительно камеры делаю в вещ. арифметике, во вторых, обход по периметру тоже делаю в вещ. арифм - точность лучше чем целыми. Что ещё я делаю с полученными x и step_x - я корректирую их, учитывая то, что экран дискретный и только потом уже текстурирую скан-лайны. Кроме всего прочего ещё не мешает левую и правую стороны многоугольника чуть по разному обрабатывать - использовать ceil() для левой и ceil()-1 для правой - тогда стыки текстур выходят правильные, незаметные. Ещё есть один эффект, который можно выправить в реализации, которая интерполирует значения u и v вдоль группы из 8/16/... пикселов в скан-лайне. Поясню эффект... Интерполяция начинается на левой стороне полигона и заканчивается на правой. Если полигон на экране имеет вертикальные левую и правую рёбра, то всё выглядит ок. Если же левые и правые под некоторым углом к вертикали (трапецевидная/ромбовидная/... проекция на экран), то группы из тех 8/16/... пикселов имеют смещённые центры относительно друг друга в соседних скан-лайнах. Это приводит к некоторой волнистости текстуры на экране - сдвиг в некоторых местах текстуры на 1 пиксел в соседних скан-лайнах. Происходит это от того, что ошибка при интерполяции u и v максимальна где-то в центре группы. Если группы в соседних сканлайнах точно одна под другой, то ошибка не заметна, т.к. она на одном и том же экранном Y в соседних скан-лайнах. Если же ситуация с не строго вертикальными рёбрами, то в соседних скан-лайнах масимум ошибки на разных экранных Y. Можно исправить, если первую группу выбрать заканчивающейся в ближайшей позиции, где остаток от деления X на 8/16/... (длина группы). В принципе, можно и не исправлять, если не нужно качество или большое разрешение на экране, где смещения на 1 пиксел почти не заметны. Казалось бы, простой топик. Hе правда ли? :) Ан - нет, приколов тут порядочно. Если нужен вариант исходника на чистом си, могу запостить. http://alexfru.chat.ru --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/16679ee4ac8cc.html, оценка из 5, голосов 10
|