два пиксельных шейдера и один вершинный
   один разъем PCIe x16, один PCIe x1, два разъема PCI
   четыре разъема DIMM (DDR 400), до 4 Гбайт памяти
   Хотя в материнской плате стоит чипсет GeForce от одной из ведущих графических фирм, производитель все же не постеснялся добавить разъем PCIe x16, куда можно установить более мощный видеоадаптер. Имеет место быть новомодный интерфейс SATA II с поддержкой RAID и четырьмя каналами для устройств UDMA 133. За 5.1-канальный звук отвечает контроллер Realtek ALC655, а за подключение к сети — чип PHY Realtek RTL8201CL F Ethernet. К услугам внешних устройств — восемь портов USB 2.0. В комплект входит программа Thunder Probe, определяющая напряжение и температуру процессора, а также Smart Fan, оптимизирующая скорость вращения вентилятора и тем самым уменьшающая шум.
Домашний кинотеатр Samsung HT-TKP75
 
   DVD-проигрыватель
   воспроизведение CD, MP3, WMA, JPEG, VCD, DivX
   декодеры DD, DTS, Dolby ProLogic II
   выходная мощность динамиков 800 Вт (5x130 Вт + 150 Вт)
   порт USB 2.0 Host
   функция караоке
   Самое необычное в этой модели — наличие USB-порта, через который можно подключать внешние устройства — например, флэш-брелок или жесткий диск (отпадает необходимость нарезать музыку или фильмы на CD-болванки), MP3-плейер или фотокамеру и прочее. Кинотеатр принимает AM/FM-программы (память на тридцать станций). В комплекте — микрофон и DVD-диск для караоке с четырьмя тысячами песен.

Compro VideoMate X800

   С чем трудно работать маркетологам, так это с ТВ-тюнерами. Ну не принято мерить у тюнеров частоты процесcора, объем памяти и мегапикселы разрешения. Не удалось в этой области сформировать у людей устойчивый ассоциативный ряд: больше — значит лучше. Не за что уцепиться рекламщику, чтобы влиять на ленивое и нелюбопытное сознание потребителя. Поэтому для привлечения клиентов — нас с вами — разработчикам приходится искать нетривиальные пути, придавая своим продуктам все новые и новые функции.
   Обычно расширение функциональности происходит на программном уровне, ибо «проапдейтить» программное обеспечение, добавив пару ненужных, но внешне привлекательных функций, гораздо проще и дешевле, чем переделывать аппаратную часть тюнера. Однако, как вы уже догадались, сегодня речь пойдет о другом продукте — TV/FM-тюнере Compro VideoMate X800, который изобилует как раз нестандартными аппаратными решениями.
   Тюнер оригинален даже внешне. Первое, что бросается в глаза, — отсутствие классического экранированного ВЧ-блока. Вместо него наличествует полупроводниковый одночиповый ВЧ-блок Xceive XC2028 (одна крошечная микросхема, маркировку которой без лупы и не разглядишь!). Плата тюнера выполнена в низкопрофильном форм-факторе, что позволяет использовать ее в любых системных блоках — даже в компактных barebone-системах. Ради компактности уменьшено и количество гнезд на торцевой панели, а стандартные разъемы RCA, S-Video и Audio I/O 3,5 мм вынесены оттуда посредством 9-пинового переходника Mini-DIN. Аналогичное решение часто используется в мобильных USB— и PCMCIA-тюнерах. Обрабатывает изображение не только 10-битный АЦП Conexant CX23880-19[На официальном сайте www.comprousa.com в спецификациях тюнера почему-то указан чип CX23883], но и дополнительная микросхема Weltrend WT8850, разделяющая видеосигнал на цвето-яркостные составляющие. Наконец, не могут не привлечь внимания две пары двухпиновых контактов, предназначенные для управления питанием компьютера. Это одно из наиболее эффектных умений тюнера. Как известно, в АТХ-системах питание на материнскую плату подается всегда, даже если компьютер выключен. Сигнал о его включении получает непосредственно материнская плата и передает в блок питания. Упомянутыми контактами тюнер «встраивается» в цепь между кнопкой включения и платой и может будить ПК по собственному желанию. Теперь неуверенные в себе пользователи наконец-то обретут возможность включать компьютер «как телевизор» с помощью тюнерского[Видимо, по мнению специалистов Compro, именно нетрадиционный метод включения вызывает у людей наибольшие проблемы при переходе от телевизора к компьютеру] пульта ДУ, а бодрые энтузиасты смогут впрок планировать захват. Уезжаете вы, например, отдыхать в Катманду, а новостей российских пропускать не желаете — вдруг революция случится? Настраиваете софт так, чтобы каждый вечер тюнер включал компьютер, делал захват и снова выключался. Вернувшись в отчизну, обнаружите на жестком диске пару десятков гигабайт прошедших времен. Впрочем, эта социальная идиллия возможна далеко не на всех материнских платах, а только на АТХ с поддержкой функции Wake up by PCI Device или аналогичной[На случай глюков предусмотрены джамперы для отключения функций автовключения].
   Как бы то ни было, на этом конструктивные диковины заканчиваются, если, конечно, не считать таковой наличие внутреннего аудиовыхода, ставшего в последнее время стандартом де-факто.
   Тюнер радует еще и щедрым комплектом поставки. Кроме самой платы, в коробке находится:
   три CD: установочный с драйверами и русскоязычным ПО, Ulead DVD Movie Factory, Ulead Media Studio 8 SE;
   шнур для внутреннего соединения со звуковой платой;
   шнур для внешнего соединения со звуковой платой;
   кабель для подключения к материнской плате;
   сменная торцевая панель для установки в компактные системные блоки;
   ИК-приемник и пульт ДУ;
   FM-антенна;
   англоязычное руководство пользователя (русскоязычное находится на установочном CD);
   переходники для подключения внешних устройств и TV-антенны.
   Все это добро было установлено в мой тестовый компьютер следующей конфигурации:
   процессор Celeron 1.7@2,0 ГГц;
   память 768 Mбайт PC2100 DDR;
   материнская плата Abit IT7;
   видеокарта Radeon 7500;
   жесткий диск WD 200 Гбайт;
   звуковая карта SB Live! 24 bit;
   блок питания Chieftek 300 Вт;
   свежеустановленная Windows XP SP2 Rus.
   К сожалению, программное обеспечение нельзя отнести к плюсам Х800. Неприятности начались с самого начала. В стандартной конфигурации ПО инсталлировалось минут десять, на винчестере появилось аж пять драйверов для компонентов тюнера, причем запуск мастера установки оборудования инициализировался раньше, чем нужные компоненты скопировались в системную директорию Windows, так что пришлось откатывать его назад и начинать сначала. В процессе установки ПО заменило какие-то системные файлы Windows, отчего она начала ругаться и требовать оригинального диска для их восстановления. Поскольку искать диск было лень, сообщение я проигнорировал, после чего Windows Media Player 9 (который тоже зачем-то ставится автоматом) инсталлироваться отказался… В довершение всего в конце установки программа настойчиво порекомендовала перезагрузиться. В общем, до лаконичности инсталляторов современных конкурентов X800 очень далеко.
   Далеко ему и до их функциональности. Да, софт педантично следует тенденциям спроса и имеет все популярные функции[Не забыт и timeshift, куда же без него], но сделаны они как бы нехотя и через силу. Слезы наворачиваются на глаза, когда, глядя на полупустые окна конфигурации Compro PVR2, вспоминаешь настройки Behold TV… Мне так и не удалось не только найти настройки метода deinterlace, но даже упоминания о том, какой метод используется[На сайте производителя указан метод deinterlace. — Прим. ред.]. Несмотря на то что Compro PVR2 формально позволяет захватывать видео, отсутствие индикации и сколько-нибудь глубоких настроек процесса ставит крест на серьезном использовании этой функции. Эстетический вид «дружественного и интуитивно понятного интерфейса» вы можете оценить самостоятельно (рис. 1).
   К счастью, тюнер корректно поддерживается сторонними программами. Мне без труда удалось осуществить захват по всем канонам жанра с помощью iuVCR, так что энтузиасты смогут подыскать альтернативное ПО на свой вкус. А непритязательные пользователи останутся довольны и Compro PVR2.
   В одном из предыдущих обзоров я как-то сказал, что при уверенном приеме качество изображения всех последних тюнеров, попадавших ко мне на тестирование, стабильно высокое и без специального намерения отличить один от другого не удастся. Вот и накаркал! Из-за полупроводникового ВЧ-блока и аппаратного цвето-яркостного (Y/C) разделителя X800 дает как минимум специфическую картинку. По субъективным ощущениям, чувствительность ВЧ-блока Xceive XC2028 чуть ниже, чем у современных классических аналогов, однако делать из этого какие-либо обобщения было бы самонадеянно. Огрехи в приеме незначительны, а после дополнительной Y/C-обработки они и вовсе становятся незаметными. Тем более после «первого свидания» следует воздержаться от скоропалительных оценок полупроводниковой технологии в целом, так что позвольте ограничиться аккуратным выводом: ВЧ-блоки Xceive сравнимы по качеству приема с классическими аналогами.
   За дальнейшую обработку сигнала отвечают 10-разрядный АЦП CX23880 и чип Y/C-разделения. Первый давно и успешно используется в самых разных моделях тюнеров, не подвел он и Х800. А вот на работе Y/C-разделителя Weltrend WT8850 стоит остановиться. В настройках ПО тюнера есть возможность выбрать один из трех режимов обработки сигнала: универсальный «Режим ТВ» для большинства телепередач, «Режим шумоподавления» и «Режим повышенной четкости» (облегчает восприятие текстовой и графической информации). Также можно выбрать ручную настройку, при которой запускается отдельная утилита Tweak Y/C (рис. 2). Здесь можно тонко настроить степень шумоподавления, задержку Y— и C-компонент друг относительно друга и прочие параметры. При работе со сторонним софтом утилиту можно запустить вручную — она живет отдельной жизнью и, хоть и влияет на тюнер в реальном времени, никак не отражается на стабильности его работы.
   Вне зависимости от выбранного режима работы Y/C-разделение всегда сказывается на изображении. Картинка слегка «пластмассовая», а контуры движущихся объектов оставляют легкие следы. Подобные эффекты наверняка знакомы тем, кто занимался захватом и кодированием видео с помощью ТВ-тюнера. Именно таким становится изображение, прошедшее через цепочку «шумодавов» и подготовленное к компрессии. Всякий желающий может смоделировать похожий эффект, последовательно обработав какую-либо видеозапись в VirtualDUB’e фильтрами Chroma Noise Reduction (default) и Dynamic Noise Reduction (8—10). Впрочем, на восприятии видео в динамике эти эффекты особо не сказываются, а вот любители оцифровки с ТВ и VHS наверняка будут рады: при более тонкой ручной настройке аппаратная постобработка вполне сможет заменить программную. А это означает заметное (до пяти раз) уменьшение времени окончательного кодирования захваченного материала.
   Собравшись пропеть новаторской аппаратной части тюнера дифирамбы, я чуть было не поплатился за торопливость: открылась пренеприятная особенность, имеющая явно «железные» корни. На некоторых каналах в левой части экрана возникают паразитные флуктуирующие розовые искажения (рис. 3). По неофициальной информации, проблема аппаратная и может быть решена перепайкой тюнера (конечно, с потерей гарантии).
   Уже после тестирования я общался со специалистами из Compro, которые сообщили, что аппаратная проблема с тюнером решена — заменен один из резисторов, и в поставках для России идет новая версия. Кроме того, на сайте компании появилось новое ПО, с помощью которого теперь возможна произвольная сортировка каналов. — С.Л

OpenGL vs. Direct3D

   OpenGL и Direct3D — две основные на сегодняшний день аппаратно-ускоряемые библиотеки для создания компьютерной трехмерной графики. Перед каждым начинающим 3D-программистом встает вопрос: какой из двух вариантов API выбрать? Вопрос этот совсем не прост, собственного опыта для принятия осознанного решения, как правило, не хватает. И хотя на форумах такие темы обсуждаются регулярно, почерпнуть из них информацию порой непросто, поскольку «советы бывалых» обычно основываются на личных предпочтениях.
   Итак, что же выбрать начинающему «тридешнику»? Ответ зависит от трех факторов: от поставленной задачи, от умений программиста и от того, чем он намерен заниматься в дальнейшем. С первым фактором все более или менее просто: начинающий 3D-программист может быть или совсем зеленым новичком, или обладать каким-то опытом в других областях. Второй фактор более расплывчат и во многом зависит от первого, ведь только-только ступая на стезю программирования, очень трудно четко поставить задачу, обычно хочется написать что-то такое, чтоб было красиво и все двигалось и блестело; из этого мы и будем исходить, советуя ту или иную библиотеку. В случае же с опытным программистом дела обстоят иначе; тут может потребоваться или визуализация результатов какой-то вычислительной программы, или внезапно появился выгодный заказ, да вот беда, с необходимостью 3D-графики. Ну а третий фактор очень грубо можно разделить на два направления: первое — разработка игр и все что с этим связано; второе — написание приложений для работы с 3D-графикой и визуализация научных данных (скромно назовем все это научной графикой). Третий фактор тоже тесно связан с первым: практически все «молодые и перспективные» хотят писать игры, ну так уж повелось; и в общем-то они правы — игровая отрасль не только интересная и быстро развивающаяся, но и гораздо лучше представлена на территории нашей страны. В самом деле, все слышали об отечественных играх и компаниях их разрабатывающих, но мало что известно об успехах россиян на поприще научной графики.
   Теперь подробнее остановимся на истории каждой из технологий. Начнем с Direct3D. В те давние времена, когда Windows только входила в нашу жизнь, абсолютное большинство игр писалось еще под DOS, а Windows 3.1 не предоставляла эффективных средств доступа к видео— и звуковым устройством. Такое положение дел не устраивало Microsoft, и корпорация вознамерилась сделать 3D API, который стал бы удобным инструментом в руках разработчиков игр. То ли из-за нехватки времени и ресурсов, то ли по другим причинам Microsoft решила не изобретать велосипед, а использовать наработки компании RenderMorphics. Это был совсем маленький проект, на его базе была создана небольшая библиотека Game SDK, которая и стала впоследствии именоваться DirectX 1.0. И как это ни прискорбно для Microsoft, первому DirectX не суждено было стать распространенным средством разработки игр. Причин тому было множество, и если с плохой структурой и сложностью использования еще можно было мириться, то многочисленные ошибки и неповоротливость написанных игр ставили крест на широком распространении этой технологии. Но не в правилах Microsoft сдаваться, и она немедленно принялась совершенствовать свое неудачное детище. Первой по-настоящему принятой программистским сообществом версией DirectX стала 7.0. Этот продукт был лишен большинства из «детских болезней» своих предшественников: научился почти полностью использовать потенциал видеокарт, его интерфейс стал гораздо приятнее, и, главное, DirectX 7.0 был стабилен (сейчас существует DirectX 9.0 — мощное и удобное средство разработки). Вы, наверное, обратили внимание, что я периодически называю вроде бы одно и то же по-разному — то DirectX, то Direct3D. На самом деле все просто: Direct3D — это часть DirectX. До седьмой версии в DirectX было два графических инструмента: Direct3D и DirectDraw, для трех— и двухмерной графики соответственно. DirectX содержит и другие полезные компоненты — например, DirectSound и DirectPlay. Первый используется для воспроизведения звуков, а второй облегчает жизнь разработчику игр: он берет на себя работу с вводом и даже включает сетевые интерфейсы.
   История OpenGL ведется с 1992 года. Компания Silicon Graphics создала его как открытый стандарт. Отсюда и первая часть названия, а GL означает Graphic Library (графическая библиотека). На данный момент OpenGL находится под контролем комитета Architectural Review Board (ARB), куда входят представители наиболее влиятельных в 3D-секторе корпораций — nVidia, ATI, SGI, Apple, Intel, id Software и, что особенно интересно, Microsoft. ARB является по сути некой бюрократической машиной, чья задача — вводить в стандарт OpenGL новые возможности. Для этого был создан механизм расширений. Как и любая бюрократическая машина, ARB работает медленно и неповоротливо, что стало главной проблемой OpenGL, который просто не может угнаться за стремительным развитием графических технологий. Достаточно сказать, что между выходом версий 1.0 и 1.4 прошло больше десяти лет! Сейчас этот стандарт морально устарел. Хотя все новые возможности современных видеоускорителей доступны через расширения ARB, пользоваться ими, прямо скажем, неудобно.
   OpenGL, создававшийся для профессионального сектора, прочно в нем закрепился во многом благодаря своей переносимости, а вот нишу PC-игр практически полностью уступил своему конкуренту. Изменится ли эта ситуация? Чтобы существенно потеснить DirectX в game-секторе, ARB необходимо вывести OpenGL на современный уровень, и, надо сказать, комитет не сидит сложа руки: грядет так долго ожидаемая вторая версия GL, ее создатели хотят снова создать стандарт на десятилетие вперед. А что же Microsoft? Попытается ли компания захватить и профессиональный сектор? Это возможно только с выходом DirectX под другие операционные системы, что вряд ли случится.
   Перейдем к сравнению технологий. DirectX построен по объектно-ориентированной схеме, а OpenGL по процедурной. Что лучше? Программа на GL одинаково «хорошо» выглядит и на C++, и на чистом C, чего не скажешь о DX (хотя это надуманное преимущество, сейчас мало кто пишет на C, особенно под Windows). А вот простота архитектуры GL — неоспоримый плюс: GL работает исключительно с примитивами (треугольники, отрезки и точки) и управляется набором булевых переменных, которые позволяют включать или отключать некоторые функции — например, накладывать текстуру или нет, использовать ли освещение и т. д. Код для отображения «вашего первого треугольника» занимает примерно пятьдесят строк. В DX эта цифра куда больше. С одним-то треугольником у GL все хорошо, но как только захочется использовать что-нибудь из современных 3D-эффектов — появляются расширения GL, и еще недавно простой и понятный код тонет в непонятных и ничего не значащих для человека, не посвященного в тайны 3D-графики, строках.
   Как ни странно, ведутся споры о производительности. Проверить это проще простого, но зачем? — ведь результат легко предсказуем. Он будет одинаков для обеих библиотек, поскольку сейчас практически все функции реализуются напрямую через аппаратные ускорители. Расхождение результатов может быть только из-за погрешности измерений; сюда я отношу и оптимизацию тестирующего кода, и специфику конкретных драйверов, но в целом для выполнения кода на GL и DX видеокарта должна выполнять одни и те же действия, а значит, и дискуссии о быстродействии беспочвенны. Конечно, можно копать глубже и спорить о качестве шейдерных компиляторов HLSL[High-level Shader Language — С-подобный язык для написания шейдеров в DirectX 9.0] и GLSL[OpenGL Shading Language — аналог HLSL для OpenGL], но мы не будем лезть в такие дебри, тем более что оба решения далеки от совершенства.
   Что мы имеем: львиная доля создателей игр выбирает DirectX за удобную поддержку современных возможностей, остальные предпочитают OpenGL — за переносимость и простоту написания программ. Ситуация в общем-то нормальная, если вспомнить, для чего создавалась каждая из технологий. Но если мы обратим внимание, что Doom III, самая нашумевшая игра последнего времени, написана на OpenGL, то поневоле закрадывается подозрение, что не все так просто. Может быть, в id Software знают какой-то секрет, делающий применение OpenGL предпочтительнее? Нет, просто команда разработчиков уже привыкла работать на нем. Это еще раз красноречиво говорит о том, что GL мало чем уступает DirectX.
   Я много говорил о возможностях современного железа, но ни разу не упомянул о том, что же это за возможности и что для их использования предоставляют OpenGL и DirectX. Прежде всего, нынешние видеокарты — это программируемые устройства. Теперь некоторый код можно выполнять прямо на графическом процессоре (GPU). Эти программы называют шейдерами. Они позволяют создавать сложнейшие эффекты в реальном времени. Изначально эти программы можно было писать только на «фирменных» языках производителей видеокарт — ATI и nVidia. Оба языка очень похожи на ассемблер, но, увы, несовместимы. А кому захочется писать два разных кода для реализации одного и того же эффекта? И вот в DirectX 8.0 появляется универсальный язык программирования шейдеров. Он тоже похож на ассемблер, но позволяет обойтись одним шейдером для обоих типов видеокарт. И снова закавыка: много ли людей любят программировать на языках низкого уровня? И вот Microsoft представляет в своем DX 9.0 уже C-подобный язык HLSL. ARB в ответ выкатил аналогичную технологию GLSL. Как уже говорилось, обе эти технологии далеки от совершенства, прежде всего из-за слабой оптимизации компиляторов. Например, создатели игры Chronicles of Riddick (кстати, использовавшие OpenGL) для увеличения производительности написали все шейдеры в двух вариантах, на родных ассемблероподобных языках от ATI и nVidia. Это выглядит странным, так как обычные компиляторы показывают совсем неплохие результаты.
   Итак, у нас две библиотеки с практически одинаковыми возможностями и быстродействием. Отличия лишь в сложности написания кода. И даже здесь явного лидерства нет. Все зависит от уровня используемых в программе эффектов. Если нам достаточно базовой функциональности OpenGL (то есть мы не используем расширений), то разумнее использовать именно GL, а если дело дошло до продвинутых эффектов, тут предпочтительнее Direct3D. Но с появлением второго GL ситуация может в корне измениться, так как переход на новую версию избавит GL от большинства недостатков. Но Microsoft тоже не будет стоять на месте, и вполне возможно, что к моменту своего выхода OGL 2.0 уже устареет. Да и в дальнейшем для успешной конкуренции с DX ARB понадобится существенно переработать механизм внесения изменений в библиотеку, чтобы сделать OpenGL более динамично развивающимся.
   Так что же выбрать начинающему 3D-программисту? Молодому поколению я, скрепя сердце, посоветую DirectX. Прежде всего потому, что знание DX поможет стать создателем игр. Все российские компании, разрабатывающие игры, используют эту технологию. А вот совет программистам с опытом не так однозначен. Чтобы ваша программа работала не только на Windows, но и на других операционных системах, следует выбрать GL. Далее следует решить, какие эффекты вам необходимы: можете ли вы обойтись стандартной функциональностью GL, или вам непременно нужно использовать более «продвинутые» эффекты. И, наконец, на сцену выходят личные предпочтения: одним придется по вкусу объектная структура DirectX, другим же она покажется слишком громоздкой. И, конечно, не стоит забывать старый анекдот: «Какой дистрибутив Linux ставить? Тот, который стоит у ближайшего гуру».
 
Простейшая программа на OpenGL и на Direct3D
   Сейчас мы подробно разберем написание простейшей программы на этих двух библиотеках. Наши программы будут делать одно и то же, а именно рисовать один-единственный треугольник c углами разных цветов. Мы сознательно опустим всю подготовительную работу и сосредоточимся на рисовании графического примитива.
   Для начала очистим фон. В OpenGL для этого потребуется написать следующую строку:
   glClear(GL_COLOR_BUFFER_BIT);
   где glClear() — функция, предназначенная для очистки буферов, а константа GL_COLOR_BUFFER_BIT указывает, что именно нужно очистить.
   Для аналогичной операции в D3D нужно написать
   d3d_Device->Clear (0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0, 0);
   Clear обладает большей функциональностью и, как следствие, более сложным синтаксисом. Поскольку нам эта функциональность не нужна — среди параметров так много нулей. Первые два отвечают за возможность очищения не всего кадра, а некоторого количества прямоугольников. Последняя пара отвечает за очистку только тех точек, удаление которых от камеры (координата Z) находится в определенных пределах. Константа D3DCLEAR_TARGET указывает на то, что мы будем очищать буфер неким цветом, указанным в четвертом параметре (черный цвет).
   Вот рабочее пространство и готово, можно приступать к рисованию. В OGL все примитивы для обрисовки должны находиться между вызовами glBegin() и glEnd(), некоторым их аналогом в D3D являются d3d_Device->BeginScene () и d3d_Device->EndScene (). В случае с OGL уже можно привести фрагмент кода, выполняющий нашу задачу:
   glBegin(GL_TRIANGLES);
   glColor3d(1,0,0);
   glVertex3d(1,2,3);
   glColor3d(0,1,0);
   glVertex3d(4,5,6);
   glColor3d(0,0,1);
   glVertex3d(7,8,9);
   glVertex3d — это вершины нашего треугольника, Название функции интуитивно понятно, но 3d, как ни странно, не означает «трехмерный»; точнее, 3 — как раз означает, а вот d — это тип аргументов (double). GL_TRIANGLES указывает, что все последующие вершины будут последовательно образовывать треугольники (если бы у нас было не три, а шесть вершин — получилось бы два треугольника). glColor3d принимает на вход цветовые компоненты RGB, и все вершины, идущие после него и до следующего вызова glColor, будут иметь соответствующий цвет.
   В D3D перед рисованием необходимо подготовить специальную структуру данных:
   struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color;};
   CUSTOMVERTEX g_Vertices[] =
   {1, 2, 3, 1, 0xffff0000},
   {4, 5, 6, 1, 0xff00ff00},
   {7, 8, 9, 1, 0xff0000ff},
   LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer = NULL;
   Эта структура содержит и координаты вершин, и их цвета. p_VertexBuffer — указатель на нашу структуру, для хранения вершин.
   Теперь напишем следующее:
   d3d_Device->CreateVertexBuffer (3*sizeof(CUSTOMVERTEX),
   0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &p_VertexBuffer);
   VOID* pVertices;
   p_VertexBuffer->Lock (0, sizeof(g_Vertices), (BYTE**)&pVertices, 0);
   memcpy (pVertices, g_Vertices, sizeof(g_Vertices));
   p_VertexBuffer->Unlock();