О ограниченное закрашивание производило такие же блики, как и закраска Фонга; О ограниченное закрашивание производило блики, значительно отличающиеся от тех, которые получаются при закраске Фонга.

8.3.5. Алгоритм закрашивания Фонга Произведите необходимые изменения в коде «плиточника» для включения в него закраски Фонга. При этом должно подразумеваться, что для каждой грани известны нормальные векторы в вершинах. Кроме того, обдумайте, как можно аппроксимировать закраску Фонга с помощью алгоритма плавного закрашивания OpenGL. (Подсказка. Увеличьте число граней в модели.)

8.4. Удаление невидимых поверхностей

8.4. Удаление невидимых поверхностей Очень просто включить в процесс визуализации удаление невидимых поверхностей, описанный в предыдущем разделе, если имеется достаточно памяти для поддержки «буфера глубины», иначе называемого 2-буфером («depth buffer*, «z-buffer»). Поскольку такой буфер легко встраивается в обсуждаемый нами механизм визуализации, мы сейчас же его и рассмотрим. Другие алгоритмы для удаления невидимых поверхностей (более эффективные и требующие меньше памяти) описываются в главе 13.

8.4.1. Использование буфера глубины Алгоритм буфера глубины (или z-буфера) является одним из наиболее простых и легко реализуемых методов удаления невидимых поверхностей. Его основные ограничения заключаются в том, что он требует большого объема памяти и часто визуализирует объект, который затем заслоняется другим объектом (таким образом, время, затраченное на визуализацию первого объекта, тратится впустую.)

Концептуальное представление буфера глубины

Рис 8.28. Концептуальное представление буфера глубины На рис. 8.29 изображен буфер глубины, связанный с буфером кадров (frame buffer). Для каждого пикселана дисплее в буфере глубины хранится величинаd[i]\j] размером Ъ бит. Значение Ъ обычно находится в пределах от 12 до 30 бит. Во время процесса визуализации значение буфера глубины содержит псевдоглубину ближайшего (на данный момент) объекта для пиксела p[i][j]. Когда плиточник проходит пиксел за пикселом вдоль строки развертки, закрашивая текущую грань, он проверяет, является ли псевдоглубина этой грани меньшей величиной, чем глубина записанная в буфере для данной точки. Если это так, то вместо цветар[г][_;] записывается цвет ближайшей поверхности, а в элемент буфера d[i] [j] вместо старого значения записывается эта меньшая псевдоглубина. Грани могут рисоваться в любом порядке. Если первой рисуется более удаленная грань, то цвета некоторых пикселов этой грани будут впоследствии замещены цветами пикселов более близкой грани. Следовательно, время, затраченное на визуализацию более удаленной грани, будет затрачено впустую. Отметим, что данный алгоритм работает для объектов любой формы, включая криволинейные поверхности, поскольку он находит ближайшую поверхность, проводя поточечную проверку.


⇐ Предыдущая| |Следующая ⇒