à droite dans la figure ci-dessus, le pixel en jaune est
traversé par la droite, mais il n'est pas "visité", ni testé,
par l'algorithme. comment inclure ce pixel ?
l'idée est de tester un point intermédiaire, entre p(i) et
p(i+1) : p(i + 0.5)... pourquoi ? la droite sort du pixel en
traversant soit le coté supérieur soit le coté droit du pixel.
le point intermédiaire permet d'évaluer la position de la droite
lorsqu'elle sort du pixel : elle est soit au dessus (prochain
pixel en haut), soit au dessous (prochain pixel à droite) du
coin superieur droit du pixel...
il suffit de tester systématiquement les 2 points, à chaque
itération, pour obtenir la figure de gauche. cet algorithme à
été publié par J.E. Bresenham en 1962 (cf
wikipedia).
les processeurs de l'époque ne pouvaient pas faire de calculs
sur des réels de manière efficace et l'algorithme est construit
uniquement sur des calculs entiers, ce qui à l'avantage d'etre
exact, mais très pénible. il faut traiter les 8 orientations de
droites possibles, et au final l'algorithme n'est pas très
adapté aux processeurs graphiques (remarque : les calculs sur
des réels sont plus rapides que sur des entiers...)
au final, tracer une droite discrete se résume à :
vec3 a= vec3( ... )
;
vec3 b= vec3( ... );
vec3 d= { ... };
int n= { ... };
vev4 color= vec4( ... );
for(int i= 0; i < n; i++)
{
vec3 p= a + i *
d;
// p(i)
vec3 pm= a + (i + 0.5) *
d; // p(i+.5), point intermédiaire /
midpoint
pixel(floor(p.x),
floor(p.y))= color;
pixel(floor(pm.x),
floor(pm.y))= color;
}
d'autres solutions adaptées aux gpu sont publiées, par exemple :
"Efficient GPU
Screen-Space Ray Tracing", M. McGuire, M. Mara, 2014