тяга к революциям TONY (TONY@EYKONTECH.COM) Спецвыпуск: Хакер, номер #064, стр. 064-012-1 НАСТОЯЩЕЕ И НЕДАЛЕКОЕ БУДУЩЕЕ ТРЕХМЕРНЫХ ТЕХНОЛОГИЙ «Шейдеры» — один из самых неудачных терминов во всей истории IT, тем не менее эта технология пришла к нам довольно давно и надолго заняла ключевое место в нашем бюджете. Однако шейдеры — это не единственный вид грызунов, которые грозят нашему бюджету дырками. Будем готовиться к купюрному листопаду :) история На платформе PC точкой отсчета для шейдеров является видеокарта NVidia GeForce 2 GTS. Именно в этой карте впервые появились шейдеры, но они не произвели прорыва. В связи с тем, что в то время шейдеры не были специфицированы и не поддерживались производителями игр, эта видеокарта так и осталась неким пробным камнем, запущенным в направлении наших бумажников. Официальная история шейдеров начинается с серии GeForce 3 — в то время появились шейдеры версии 1.Х и спецификации DirectX 8.1. Для того чтобы не отягощать тебя лишними индексами и моделями карт, далее я буду рассказывать только о поколениях шейдеров (с точки зрения программистов). Итак, сейчас мы имеем три поколения: 1.Х, 2.Х и 3.Х. На сегодняшний день (до релиза Windows Longhorn) последняя программная спецификация от Microsoft называется DirectX 9.0c, она включает в себя поддержку всех существующих версий шейдеров. терминология С точки зрения разработчика графической программы, шейдер — это набор состояний графического конвейера плюс программный код, который выполняется графическим процессором (GPU). Например, в первом Quake тоже были шейдеры… Удивлен? Все очень просто, таким термином обзывали программную абстракцию, которая управляла различными состояниями видеокарты. Бессмысленно рассматривать код, исполняемый GPU, отдельно от состояний графического конвейера — это единое и неделимое целое. На рис. «Пример шейдера» изображен типичный шейдер — код программы, написанной на языке HLSL, плюс кое-какие дополнительные навороты, позволяющие установить нужные параметры видеокарты. графический конвейер Прежде чем начинать изучение шейдеров, необходимо представлять себе, как работает современный графический конвейер, какие данные приходят ему на вход и как он обрабатывает их. Представь себе, что ты хочешь нарисовать на экране трехмерный куб. В памяти твой куб будет представляться в виде набора вершин, которые описывают составляющие его треугольники (примитивы). Каждая вершина характеризуется своими координатами в 3D-пространстве: x, y, z — минимум, без которого не обойтись. Обычно вершина содержит дополнительные параметры: нормаль, диффузный и спекулярный цвета, несколько наборов текстурных координат и т.д. Для оптимизации и чтобы задействовать вершинный кеш более эффективно, примитивы используют общие вершины. На рис. «Организация вершин» видно то, как семь вершин образуют пять треугольников. Формирование изображения на экране происходит следующим образом. В каждый момент времени главный поток программы генерирует кадры изображения. Например, для комфортной игры в шутер необходимо генерировать минимум 25 кадров в секунду. Посмотри на диаграмму «Графический конвейер». Создание кадра начинается с того, что карте сообщается, какую именно геометрию ей необходимо нарисовать для этого кадра (шаг «буфер вершин»). Каждая вершина обрабатывается вершинным процессором, в который заранее загружена вершинная программа (вершинный шейдер). Обычно эта программа трансформирует вершины исходя из заданных мировой и видовой матриц и для каждой вершины вычисляет специфические данные (нормаль, цвет). Как ты помнишь, вся геометрия разбивается на треугольники. Видимые на экране фрагменты треугольников (после отброса невидимых фрагментов) попадают в пиксельный процессор, где они обрабатываются фрагментным процессором (пиксельный шейдер), который рассчитывает цвет каждого фрагмента. Откуда берутся компоненты цвета фрагмента? Из текстур, покрывающих треугольник, из освещенности и затененности фрагмента и прочих эффектов. Параметры для каждого фрагмента передаются в пиксельный шейдер интерполированными по всему обрабатываемому треугольнику, то есть они находятся в прямой зависимости от параметров вершин треугольника. После расчета цвета фрагмента он смешивается с текущим кадром в зависимости от настроек конвейера. Буферы между различными частями конвейера позволяют задействовать конвейер наиболее эффективно — с целью минимизации его простоев. |