Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создание компьютерных игр выпуск 22


Информационный Канал Subscribe.Ru

Cоздание компьютерных игр.
Выпускается еженедельно по пятницам.
Автор рассылки - Евгений Казеко.

Выпуск 22. (от 27 февраля 2004 года)
Введение в компьютерную графику.

--------------------------------------------------------------

Мы все ближе и ближе подступаем к "настоящей компьютерной графике" - как я уже говорил, не самой главной составляющей компьютерных игр, но все же очень важной. Мы уже научились выводить различные графические объекты, в том числе и растровые изображения. Но при этом наверное не все свободно ориентируются в теоретических понятиях графики, и будет полезно осветить эти вопросы отдельным выпуском.

Материал по этой теме достаточно объемен, и все же, я попробую в сжатой форме изложить как можно больше. Конечно, возникает очень большой соблазн предположить, что многие основные моменты "все и так уже знают", но рассылка ориентируется прежде всего на людей, не имеющих никакого опыта (кроме опыта, полученного при изучении выпусков рассылки). Поэтому сегодняшний выпуск будет своеобразным "введением в компьютерную графику".

Начнем с основ, которые часто интуитивно понятны. Изображение на мониторе формируется из множества точек, называемых пикселями. Они располагаются таким же образом, как клетки на клетчатом листе бумаги, то есть экран представляет собой прямоугольную матрицу, состоящую из определенного числа рядов пикселей. Когда мы выводим изображение на экран, иногда называемый электронно-лучевой трубкой или CRT (cathode ray tube), то этот вот самый луч построчно пробегает по всем пикселям (поэтому про мониторы и телевизоры и говорят, что у них построчная развертка, а, например, у радаров развертка круговая) и подсвечивает каждый из них нужной яркостью. (Можно я не буду рассказывать про бомбардировку люминофора электронами и прочие вещи из курса физики?) После того, как луч построчно пройдет из левого верхнего угла в правый нижний, он снова возвращается наверх, и этот момент называют обратным ходом луча (vertical retrace). И все это происходит очень быстро (60 и более раз в секунду) и регулируется настройками монитора (частота обновления экрана обычно измеряется в герцах).

Но одной яркостью можно обойтись только при монохромном изображении. У цветных мониторов пиксель имеет три составляющих - красную, зеленую и синюю (RGB, red-green-blue), и луч устанавливает яркость каждой из этих составляющих. Пиксели настолько малы, что составляющие визуально сливаются, что приводит к смешиванию трех исходных цветов и дает нам все многообразие красок.

А теперь о том, чем на самом деле является пиксель. Тут все зависит от разрешения монитора. Если установлено максимальное разрешение, тогда на самом деле один пиксель может соответствовать "физическому пикселю". Но если разрешение меньше максимального, а именно так часто и бывает, то один пиксель состоит из нескольких точек монитора одного цвета (при разрешении 640*480 можно невооруженным глазом разглядеть квадратные пиксели).

Теперь о том, что такое разрешение экрана. Первая цифра указывает количество пискелей по горизонтали, а вторая - по вертикали. Соответственно, при разрешении 800*600, экран состоит из 600 рядов пикселей, по 800 пикселей в каждом.

Итак, теперь мы знаем о том, что такое пиксель, его цветовые составляющие, разрешение экрана и частота его обновления (только не путайте пожалуйста с частотой его прорисовки, которую мы задаем в наших программах, или кто-то другой в своих. При прорисовке с частотой 60 кадров в секунду (60 fps, frames per second) монитор все равно будет пробегать лучом по поверхности с частотой 100 Гц или с той, что установлена в настройках). Теперь поговорим о видеопамяти и о том, как задаются цвета.

Вы уже наверное поняли, что всю графику можно свести к последовательности пикселей определенного цвета, т.е. все алгоритмы вывода графики сводятся к простой задаче - сказать компьютеру какие пиксели каким цветом нужно зажечь. Как это делается на низком уровне (т.е. максимально удобном для компьютера)? В простейшем случае нужно всего лишь записать в специальную область видеопамяти номер этого цвета. Но это далеко не всегда так. Когда мы устанавливаем в настройках монитора количество цветов, то тем самым мы задаем видеорежим - в том числе и способ числового представления цветов.

Количество цветов определяется числом бит видеопамяти, отводимых на пиксель. При режиме 8 бит на пиксель мы можем одновременно отображать 256 цветов, при 16 бит на пиксель - 65536, а при 24 бит - 16 миллионов. Есть и другие режимы.

Рассмотрим азы. Очень не хочется подробно рассказывать про двоичную систему, но вкратце все же придется. Итак, в двоичной системе (основной для компьютера) один бит представляет собой либо единицу, либо ноль. Ох, как хорошо рассказал об этом Билл Гейтс в книге "Дорога в будущее"... Ну это так же, как в десятичной системе одним битом были бы числа от 0 до 9. Когда у нас число на единицу большее, чем девять, то оно записывается уже двумя цифрами - 10. В двоичной системе самое большое число это 1, поэтому, если число на 1 больше одного, то есть два, то его приходится записывать как 10. Ну и так далее - 3 это 11, 4 - 100, 5 - 101, 6 - 111, 7 - 1000. Почитайте учебник по информатике. Нам сейчас важно просто понять, что такое бит - минимальная единица информации в компьютере. Есть более крупная единица - байт, равная восьми битам. Минимальное значение байта - 0, а максимальное - 255, или 11111111 (восемь битов - единиц) в двоичной системе.

И вот мы наконец-то возвращаемся к цветовым режимам. Самый простой и распростаненный - 24 бит на пиксель, когда на 1 пиксель отводится 24 бит или 3 байта видеопамяти, т.е. по одному на каждую цветовую составляющую. Это значит, что в каждую цветовую составляющую можно записать число от 0 до 255 (интенсивность того или иного цвета). Вспомните макрос RGB(). Таким способом можно отобразить 255*255*255 цветов (приблизительно 16 миллионов). 16-битовые режимы сейчас используются редко, а 8-битовые - довольно часто. При режиме 8 бит на пиксель, на каждый пиксель отводится, естественно, 1 байт видеопамяти, имеющий максимальное значение 255. И этот байт используется для хранения номера цвета в палитре цветов.

Как создается палитра цветов это отдельная тема. При работе с DirectX это может пригодиться, а пока что достаточно общего представления о таких вещах. Перейдем к таким понятиям, как растровая и векторная графика. Трехмерная графика как правило векторная, т.е. мы моделируем объекты (обычно это каркасные или wireframe объекты, состоящие из "полигонов"-многоугольников), а компьютер на основе этих моделей, способа их расположения и закраски сам строит пиксельное изображение (этот процесс довольно объемен по количеству рассчетов и поэтому требует мощный компьютер). Растровое изображение - это готовый набор пикселей разных цветов, которые достаточно тем или иным способом поместить в видеопамять, и изображение появится на экране.

Такие наборы, или точнее, последовательности пикселей разных цветов, из которых состоит растровое изображение, можно конечно вводить и вручную. Но, изображение, например, размером 50*30 пикселей, состоит из 1500 пикселей, и вводить каждый пиксель вручную... К счастью, мы можем хранить растровые изображения в файлах различных форматов, самым простым из которых является bmp (bitmap - "битовая карта"). Как правило, последовательность пикселей хранится в определенном месте bmp файла в несжатом виде, что очень удобно для начинающих, так как не нужно думать о распаковке. В принципе, для начинающих очень удобно вообще не думать о чтении файла с графикой вручную, а пользоваться стандартными функциями Win32 API (что мы и делали в прошлом выпуске). Есть и другие форматы - jpg, gif, которые упаковывают изображение и, кроме того, могут содержать другие свойства (например, анимированный прозрачный gif).

Ну что же, этим мы, пожалуй, сегодня и ограничимся. Надеюсь, вас не очень утомила эта своеобразная лекция. При определении темы очередного выпуска, я сперва собирался рассказать о том, как рисовать растровые изображения, но потом решил, что без теории не обойтись. Мы оперируем такими понятиями, как разрешение, количество цветов, растр - а ведь не все знают о том, что это значит. Кое-что я все-таки недосказал. Нужно ли говорить, что чем меньше разрешение, тем крупнее и "грубее" выглядят объекты на экране? Все ли умеют отличать по внешнему виду векторную графику и 3D моделирование в реальном времени от растровой и "пре-рендеринга"? Надеюсь, что да. И в следующий раз мы уже сможем поговорить о рисовании.

Евгений Казеко.
kazeko@list.ru
www.gamecoder.nm.ru

--------------------------------------------------------------

Рассылка "Создание компьютерных игр", выпуск 22.
Выпускается еженедельно по пятницам.
Архив рассылки вы найдете по адресам http://subscribe.ru/catalog/comp.games.gamecoder и http://www.gamecoder.nm.ru/subscribe.htm.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное