Project.1.mp4
The /docs directory contains GeoGebra, Mathcad and other files that contain visualization and formal derivation of all mathematical constructions used in the renderer: rotation matrices, clipping algorithms etc.
- Вырожденные треугольники: проверить/убедиться/доказать, что для вырожденного треугольника (который является смежным с, например, двумя соседними "нормальными") справедливо следующее: если такой треугольник имеет хотя бы один фрагмент, который растеризуется, то этот фрагмент принадлежит только этому треугольнику и, соответственно, растеризуется только в контексте этого треугольники, то есть, смежные треугольники данный фрагмент не растеризуют, а значит, при реализации, например, прозрачности, данный фрагмент не будет закрашен дважды.
В данной реализации возможны "дырки" на границах двух смежных треугольников из-за инкрементного вычисления начала и конца каждой скан-линии. Например, при отрисовке левого треугольника мы можем пропустить пиксел на правом ребре из-за накопленных ошибок округления при вычислении конца скан-линии: допустим, истинное значение конца скан-линии для текущей координаты Y равно 399.000123, но инкрементом мы попали в 399.0, поэтому ceil(399.0)-1 даст 398. Но при отрисовке правого треугольника, на этом же уровне Y мы можем получить истинное начало скан-линии равное 399.000123, что даст после применения правила top-left ceil(399.000123) = 400.0, поэтому пиксел с координатой 399 также не будет отрисован. Самое простое решение проблемы: для каждой скан-линии вычислять начало и конец как текущая дельта по y, умноженная на slope ребра.
Кроме того, дырки возможно из-за того, что slope самой длинной стороны вычисляется заново внутри функций рисования flat top и flat bottom, поэтому численно при растеризации каждого типа треугольника этот slope может немного различаться для каждого треугольника.
И ещё: при растеризации смежных flat top треугольников, дельту по Y нужно вычислять не от точки сечения самой длинной стороны (которая разная для смежных треугольников) а от самой верхней вершины. Проблема в том, что, хотя формула вычисления начала и конца скан-линий одна и та же для двух треугольников, численно получаются разные значения из-за особенностей вычислений с плавающей точкой. Поэтому нужно чтобы для двух смежных flat top треугольников вычисление начала/конца скан-линии по самой длинной стороне выполнялось от самой верхней вершины, а не от разных точек сечения (intersect).
Все эти фиксы есть в модифицированной реализации растеризатора в этом репозитории.







