В результате мы приходим к следующей схеме текстурирования:
jjl! for (row = rowl; row <= row2; row++ ) for ( col = coM; col <= col2; col++ ) {
d = n.z + n.y * row + n.x * col; du = m.z + m.y * row + m.x * col; dv = l.z + l.y * row + l.x * col; u =64*du/d; v =64*dv/d;
putpixel ( col, row, textureMap [v][u]);
}
Эту процедуру, вынося наиболее сложные части за пределы внутреннего цикла, можно несколько оптимизировать.
for (row = rowl; row <= row2; row++ ) {
d = n.z+n.y*row+n.x*col1; du = 64 * (m.z+m.y*row+m.x*col1); dv = 64 * (l.z+l.y*row+l.x*col1);
for ( col = coM; col <= col2; col++ ) {
u = du / d; v = dv / d;
putpixel ( col, row, textureMap [v][u] ); d += n.x; du += m.x;
13. Элементы виртуальной реальности
Можно вместо явного вычисления соответствующих векторов и матриц в каждой вершине грани вычислить величины м' = и/г, у'= \>/2 и м> = которые изменяются линейно в пространстве картинной плоскости. Докажем это.
Плоскость, в которой лежит грань Р, можно описать следующим уравнением: хпх + упу + 2п. - (а,п). Разделим это уравнение на г и выразим отсюда \/г\
Тогда эти величины линейно интерполируются для каждого пиксела и для вычисления точных параметров текстуры используются следующие формулы: и = и'/ю и v = у'/ил Тем не менее все равно потребуется два дорогостоящих деления на каждый пиксел. Рассмотрим несколько частных случаев.
1. Грань вертикальная (рис. 13.25). В этом случае п. = 0 и определитель А не зависит от У. Тем самым если поменять циклы местами (вынести цикл по столбцам наружу) и вынести деление за пределы внутреннего цикла, то делений практически не потребуется. Фактически это означает вывод грани по столбцам, что и делалось ранее.
2. Грань горизонтальная (рис. 13.26). Тогда пх= пу = 0 и определитель А не зависит отХ. В этом случае вывод пикселов следует осуществлять по строкам; как и ранее, потребуется всего несколько делений на строку.
Компьютерная графика. Полигональные модели Попытаемся перенести этот подход на общий случай. Для этого необходимо сгруппировать пикселы таким образом, чтобы для всех пикселов каждой группы величина Л была постоянной.