Что такое пиксельные шейдеры
OpenGL pixel and vertex shaders.
Значения, вычисленные в вертексном шейдере, интерполируются по треугольнику. На видео картах, не поддерживающих пиксельные шейдеры, для каждого пикселя определяется его цвет и цвет текстуры (или нескольких текстур) в данной точке. Потом эти цвета умножаются или складываются, в зависимости от параметров выполненной ранее функции glTexEnv(), и результат записывается в буфер кадра. Если же видео карта поддерживает пиксельные шейдеры, то все намного интереснее. Интерполированные по треугольнику значения поступают на вход некоторой программы, называемой пиксельным шейдером. Это программа, состоящая из ряда арифметических и других инструкций, рассчитывает цвет пикселя, который записывается в буфер кадра. По сравнения с вертексными программами, скорость выполнения пиксельных шейдеров намного выше. Можно почти моментально выполнять штук 10 векторных инструкций для каждого пикселя! На CPU такое сделать просто невозможно.
Пиксельные и вертексные шейдеры позволяют на аппаратном уровне создавать потрясающие эффекты: освещение на пиксельном уровне, bump mapping, отражение и преломление, волны на воде, скелетная анимация персонажей, тени и многое другое!
Часть II. Вертексные программы
Чтобы использовать вертексные программы на OpenGL, надо подключить соответствующее расширение. В таблице приведены видео карты и расширения, которые они поддерживают:
GeForce 3,4 | NV_vertex_program NV_vertex_program1_1 ARB_vertex_program |
Radeon 8500 | EXT_vertex_shader |
Radeon 9700 | EXT_vertex_shader ARB_vertex_program |
NV30 | NV_vertex_program NV_vertex_program1_1 ARB_vertex_program NV_vertex_program2 |
Первая программа на NV_vertex_program.
Вертексная программа представляет собой массив символов (строку). Хранить ее можно либо в исходном файле программы, либо в отдельном текстовом файле и загружать непосредственно во время выполнения программы.
Думаю, пора приступить к написанию нашего первого шейдера.
Пока не будем задумываться, что делает такой шейдер. Загрузим его.
Теперь рисуем треугольники:
Что произойдет в результате такой операции? Нарисуется треугольник заданного цвета (при помощи glColor или glColorPointer) с текстурой (если она была включена, и были заданы текстурные координаты).
В данном примере в константы c[0..3] автоматически записывались нужные значение. Если требуется записать туда что-то другое, то применяется функция glProgramParameter. Например, чтобы записать в константу c[20] значение <1, 1, 0.5, 0>надо вызвать следующую функцию:
Что такое вершинные и пиксельные шейдеры?
Что такое вершинные и пиксельные шейдеры?
в чем разница между ними? Какой из них лучший?
5 ответов
A Вершинный Шейдер также является компонентом GPU и также программируется с использованием определенного сборочного языка, такого как пиксельные шейдеры, но ориентированы на геометрию сцены и могут делать такие вещи, как добавление мультяшных силуэтных краев к объектам и т. д.
ни лучше каждый из них имеет свое конкретное применение. Большинство современных графических карт, поддерживающих DirectX 9 или лучше включить эти функции.
есть несколько ресурсов в интернете для того, чтобы лучше понять, как использовать эти вещи. NVidia и ATI особенно хорошие ресурсы для документов по этой теме.
DirectX 10 и OpenGL 3 представили шейдер геометрии в качестве третьего типа.
в порядке перевода-
каждый результирующий примитив передается в
каждый результирующий примитив преобразуется в scanline, и каждый пиксель, который охватывает промежуток, проходит через
эти пиксели затем помещаются в текущий буфер рисования (экран, backbuffer, render-to-texture, что угодно)
все шейдеры могут получить доступ к глобальным данным, таким как матрица мировоззрения и разработчик смогите пройти в простые переменные для их для использования для освещать или любой другой цели. Шейдеры обрабатываются на ассемблерном языке, но современные версии DirectX и OpenGL имеют встроенные компиляторы языка высокого уровня c-like, встроенные в HLSL и GLSL соответственно. У NVidia также есть компилятор шейдеров CG, который работает на обоих API.
[отредактировано, чтобы отразить неправильный порядок, который я имел раньше (геометрия->вершина->пиксель), как отмечено в комментарии.]
вершинные и пиксельные шейдеры предоставляют различные функции в графическом конвейере. Вершинные шейдеры принимают и обрабатывают данные, связанные с вершинами (позиции, нормали, texcoords).
пиксельные (или, точнее, фрагментарные) шейдеры принимают значения, интерполированные из обработанных в вершинном шейдере, и генерируют фрагменты пикселей. Большинство «крутых» вещей выполняется в пиксельных шейдерах. Здесь происходят такие вещи, как поиск текстуры и освещение.
Специфический DirectX:
шейдеров:
HLSL: (язык высокого уровня затенения):
HLSL-это язык программирования, такой как C++, который используется для реализации шейдеров (пиксельных шейдеров / вершинных шейдеров).
Вершинных Шейдеров:
вершинный шейдер-это программа, выполняемая на GPU видеокарты, которая работает на каждой вершине индивидуально. Это облегчает нам возможность написать собственный алгоритм для работы с вершиной.
Пиксельные Шейдеры:
Примечание: Как вершинные шейдеры, так и пиксельные шейдеры (программы) должны быть скомпилированы с использованием определенной версии компилятора перед использованием. Компиляция может быть выполнена так же, как вызов API с необходимыми параметрами, такими как имя файла, основная функция ввода и т. д.,
с точки зрения разработки пиксельный шейдер-это небольшая программа, которая работает с каждым пикселем индивидуально, аналогично вершинный шейдер работает с каждой вершиной индивидуально.
их можно использовать для создания специальных эффектов, теней, освещения и т. д.
Так как каждый пиксель / вершина управляется индивидуально этими шейдеры поддаются очень параллельной архитектуре современных графических процессоров.
Pixel Shaders
Pixel shaders, для чего же они используются в компьютерной графике и играх? Пиксельный (или фрагментный) шейдер – это шейдерная программа, которая занимается обработкой отдельных пикселей изображения. В конечном итоге, по большей части, именно pixel shader определяет насколько красиво и естественно будет выглядеть конечное изображение. Причём, пиксельные шейдеры могут использоваться не только для формирования самого изображения, но и для его пост-процессинга, т.е. для создания некоторых спец-эффектов.
В современных играх pixel shader’ы активно используются для создания динамического освещения, в том числе очень большим количеством источников света:
Но мы с вами начнём, конечно же, с начала, т.е. с чего-то более простого. А со временем научимся делать и более сложные, интересные и красивые эффекты с помощью pixel shaders.
Алгоритм работы pixel shader аналогичен принципам работы vertex shader. Главное отличие этих шейдеров состоит в том, что pixel-шейдер, помимо прочих параметров, принимает так же параметры, переданные ему vertex shader’ом. Как это происходит? Вертексный шейдер передаёт данные в pixel shader через специальные регистры, коих немало – в большей части видеокарт их от 256 штук и больше. Каждый из регистров хранит 4 float значения, т.е. 4мерный вектор.
В уроке Shaders (Шейдеры) мы уже использовали возможности передачи данных в пиксекльный шейдер из вертексного. Структура VS_OUTPUT в вертексном шейдере как раз содержит данные, которые являются результатом работы вертексного шейдера и, следовательно, именно они передадутся в качестве параметров pixel shader’а. Параметр пиксельного шейдера float4 Color: COLOR0 содержит в себе то значение, которое передал вертексный шейдер как результат своей работы.
Но пиксельный шейдер может, помимо этих значений, использовать другие, переданные ему программой, значения – это могут быть как матрицы или вектора, так и текстуры. Давайте попробуем сделать простейший пиксельный шейдер, отображающий текстуру:
И зададим в C++ ту текстуру, которую будет использовать наш шейдер:
Кстати, для загрузки текстур форматов BMP, PNG, DDS и JPG в библиотеке D3DX есть специальная фнукция. Вот как я её использовал для загрузки текстуры:
Ну и сделал ещё некоторые менее существенные правки кода – смотрите в исходниках, там всё понятно и с комментариями на русском языке. На картинке вы видите, что получилось в итоге.
Возможно, вы заметите, что я немного изменил и вертексный шейдер, причём, передаю в нём цвет вертекса в пиксельный шейдер уже под видом текстурных координат. Так делать можно и, даже более того, так часто делают. В будущих уроках я расскажу вам зачем. В качестве эксперимента и развития собственных знаний в pixel shaders, Вы можете попробовать самостоятельно сделать так, что бы в шейдер передавались именно текстурные координаты, а не цвет, и вся работа шла именно с ними.
Немного больше информации о пиксельных шейдерах Вы можете поулчить на MSDN и, конечно, в наших будущих уроках на этом блоге!
Shader — это не магия. Написание шейдеров в Unity. Введение
Всем привет! Меня зовут Дядиченко Григорий, и я основатель и CTO студии Foxsys. Сегодня хочется поговорить про шейдеры. Умение писать шейдеры (и в целом работать с рендером) очень важно при разработке под мобильные платформы или AR/VR, если хочется добиться крутой графики. Многие разработчики считают, что шейдеры — это магия. Что по ним мало хорошей информации, и что чтобы их писать нужно иметь, как мимимум, звание кандидата наук. Да, разработка шейдеров по своим принципам сильно отличается от клиентской разработки. Но основное понимать базовые принципы работы шейдеров, а так же знать их суть, чтобы в этом не было ничего магического и поиск информации по этой теме был простой задачей. Данная серия статей рассчитана на новичков, так что если вы разбираетесь в программировании шейдеров, данная серия вам не будет интересна. Всем же кто хочет разобраться в этой теме — добро пожаловать под кат!
Это вводная статья в которой я расскажу общие принципы написания шейдеров. Если тема будет интересна, то мы разберём уже подробнее в отдельных статьях: вершинные шейдеры, геометрические шейдеры, фрагментные/пиксельные шейдеры, трипланарные шейдеры, скринспейс эффекты и компьют шейдеры (OpenCL, СUDA и т.п.). И в целом всю ту магию, которую можно делать на GPU. Разбираться это будет в контексте стандартного рендер пайплайна Unity. Так LWRP и HDRP мне пока кажутся немного сыроватыми.
Что такое шейдер?
По сути это программа выполняемая на гпу, выходными данными которых является разная информация. В вершинных шейдерах — это параметры вершин меша. Пиксельные шейдеры выполняются попиксельно.
Для понимания того, как работают шейдеры нужно рассказать, что такое графический конвейер (graphic pipeline). Очень часто про эту тему говорят довольно сложными словами, но мы это немного упростим для понимания. Возьмём на примере OpenGL. В этом плане мне очень нравится эта картинка.
Если опустить детали связанные с освещением и т.п. То в целом с точки написания тех же Unlit шейдеров на hlsl суть такова. У нас есть в шейдере
где мы определяем, что вертексная часть шейдера будет писаться в функции vert, а фрагментная — в функции frag.
Структуры которые мы описываем в шейдере определяют какие данные мы будем забирать из меша и после обработки вертексным шейдером, которые висят на нашем MeshRenderer и MeshFilter объекте.
Дальше вертексный шейдер вычисляет получив на вход данные appdata и отдаёт результат в виде структуры v2f, которая дальнейшем пойдёт в фрагментный шейдер. Который в свою очередь уже рассчитает цвет пикселя. Так как информация v2f пишется только в вершины (которых меньше, чем пикселей), данные в фрагментной части интерполируются. Всё это можно представить как то, что vert считается в каждом вертексе независимо. Потом результат передаётся в фрагментную часть, где frag для каждого пикселя считается так же независимо. Так как вычисления производятся параллельно, в данных частях нет никакой информации о соседях (если не передавать её как-то хитро).
Более детально все нюансы, а так же множество примеров описаны в документации Unity docs.unity3d.com/Manual/SL-Reference.html
Языки программирования шейдеров
Дальше с точки зрения изучения шейдеров, когда эти языки уже не вызывают вопросов можно посмотреть какие возможности предоставляет сам по себе«UnityCG.cginc» и другие библиотеки написанные юнити, чтобы упростить себе работу.
Почему if в шейдерах — это плохо?
Тут важно понимать, как шейдеры исполняются на уровне железа и почему они такие быстрые, что могут выполнять миллионы операций не напрягаясь.
Основная идея графических процессоров — это максимальная параллельность вычислений. Тут нужно ввести такое понятие, как “волновой фронт”. По сути оно довольно простое, волновой фронт — это группа шейдеров выполняющая одну и туже последовательность операции. То есть с точки зрения гпу самый лучший вариант, когда в одно и тоже время выполняются одни и те же инструкции. Единственно различие в выполнении — это входные данные. Проблема ветвления в том, что может случиться ситуация, когда в одной группе шейдеров, шейдеры должны вызывать разные операции. Что в свою очередь приводит к созданию нового волнового фронта, копированию в него данных и т.п. А это очень дорого.
Там есть нюансы и исключения, но для того чтобы спокойно писать if, вы должны понимать, как он себя поведёт на целевой версии графического апи. Так как тот же самый OpenGL ES 2 или DX11 в этом плане сильно отличаются.
Зачем мне это знать, ведь есть нодовые редакторы?
Важно понимать, что нодовые редакторы — это в первую очередь инструмент для техникал артистов. Это специалисты, которые имеют экспертизу в математике, но в большей степени являются дизайнерами. Шейдеры типа wireframe (где требуется понимание барицентрических координат) или же преобразование к картезианским координатам, которое используется для хитрых проекций, в разы проще делать кодом, так же как и многие математические модели физических материалов. При этом с точки зрения шейдерного программиста вы по сути делаете кастомные ноды и инструменты для техникал артистов, чтобы творить реальную магию. Нодовые редакторы имеют ограниченный функционал с этой точки зрения. Поэтому важно уметь писать шейдеры на языках типа hlsl. Понимать то, как работает рендер и т.п.
Полезные ресурсы для изучения
С точки зрения изучения шейдерного программирования хорошим упражнением является переписывание шейдеров с www.shadertoy.com или glslsandbox.com. Кроме того существует крутой профиль специалиста из Unity, где можно посмотреть много интересного github.com/keijiro
Всё остальное — это математика и понимание физики эффектов. Это в чём-то похоже на смешивание ингредиентов, если не решается конкретная задача физического моделирования. Много любопытного можно сделать смешивая между собой шум, преломление, подповерхностное рассеивание света, каустику, эффект Френеля, реакцию диффузии и прочие физические свойства объектов. В целом шейдерное программирование это безусловно не элементарно, и там есть куда копать в глубину.
Если тема шейдеров будет интересно, то постараюсь выпустить серию на статей на эту тему, уже с конкретными примерами и туториалами на тему создания разных эффектов. Предлагайте в комментариях про что вам было бы интересно прочитать и какие темы изучить. Спасибо за внимание!
Все эффекты в статье — это запись эффектов шейдеров с shadertoy.
Что нужно знать о видеокартах? Часть 1.
Что нужно знать о видеокартах?
Базовые компоненты видеокарты:
Словарик базовых графических терминов
Частота обновления (Refresh Rate)
Как в кинотеатре или на телевизоре, ваш компьютер симулирует движение на мониторе, выводя последовательность кадров. Частота обновления монитора указывает на то, сколько раз в секунду на экране будет обновляться картинка. Например, частота 75 Гц соответствует 75 обновлениям в секунду.
Если компьютер обрабатывает кадры быстрее, чем может выводить монитор, то в играх могут появиться проблемы. Например, если компьютер просчитывает 100 кадров в секунду, а частота обновления монитора составляет 75 Гц, то из-за накладок монитор может выводить только часть картинки за период своего обновления. В итоге появляются визуальные артефакты.
В качестве решения можно включить V-Sync (вертикальную синхронизацию). Она ограничивает число выдаваемых компьютером кадров до частоты обновления монитора, предотвращая появление артефактов. Если включить V-Sync, то число просчитываемых в игре кадров никогда не превысит частоту обновления. То есть при 75 Гц компьютер будет выводить не более 75 кадров в секунду.
Пиксель (Pixel)
Слово «Pixel» расшифровывается как «picture element» — элемент изображения. Он представляет собой крошечную точку на дисплее, которая может светиться определённых цветом (в большинстве случаев оттенок выводится сочетанием трёх базовых цветов: красного, зелёного и синего). Если разрешение экрана составляет 1024×768, то на нём можно заметить матрицу из 1024 пикселей по ширине и 768 пикселей по высоте. Все вместе пиксели и составляют изображение. Картинка на экране обновляется от 60 до 120 раз в секунду, в зависимости от типа дисплея и данных, выдаваемых выходом видеокарты. ЭЛТ-мониторы обновляют дисплей строчка за строчкой, а плоские ЖК-мониторы могут обновлять каждый пиксель по отдельности.
Вершина (Vertex)
Все объекты на 3D-сцене состоят из вершин. Вершина — точка в трёхмерном пространстве с координатами X, Y и Z. Несколько вершин можно сгруппировать в полигон: чаще всего это треугольник, но возможны и более сложные формы. Затем на полигон накладывается текстура, что позволяет объекту выглядеть реалистично. 3D-куб, показанный на иллюстрации выше, состоит из восьми вершин. Более сложные объекты имеют кривые поверхности, которые на самом деле состоят из очень большого числа вершин.
Текстура (Texture)
Текстура — это просто 2D-картинка произвольного размера, которая накладывается на 3D-объект, чтобы симулировать его поверхность. Например, наш 3D-куб состоит из восьми вершин. До наложения текстуры он выглядит как простая коробка. Но когда мы нанесём текстуру, то коробка становится окрашенной.
Шейдер (Shader)
Сегодня существует два вида шейдеров: вершинные и пиксельные. Вершинные программы-шейдеры могут изменять или трансформировать 3D-объекты. Пиксельные программы-шейдеры позволяют менять цвета пикселей на основе каких-либо данных. Представьте себе источник света на 3D-сцене, который заставляет светиться освещаемые объекты ярче, и в то же время, приводит к отбрасыванию тени на другие объекты. Всё это реализуется с помощью изменения цветовой информации пикселей.
С выпуском следующего интерфейса прикладного программирования (API, Application Programming Interface) Microsoft DirectX 10 на свет выйдет третий тип шейдеров под названием геометрические шейдеры. С их помощью можно будет ломать объекты, модифицировать и даже уничтожать их в зависимости от требуемого результата. Третий тип шейдеров можно будет точно так же программировать, как и первые два, но роль его уже будет другой.
Скорость заполнения (Fill Rate)
Очень часто на коробке с видеокартой можно встретить значение скорости заполнения. В принципе, скорость заполнения указывает на то, с какой скорость графический процессор может выдавать пиксели. У старых видеокарт можно было встретить скорость заполнения треугольников (triangle fill rate). Но сегодня выделяют два типа скорости заполнения: пиксельную (pixel fill rate) и текстурную (texture fill rate). Как уже говорилось, пиксельная скорость заполнения соответствует скорости выдачи пикселей. Она рассчитывается как число растровых операций (ROP), помноженное на тактовую частоту.
Текстурную скорость заполнения ATi и nVidia считают по-разному. nVidia считает, что скорость получается умножением числа пиксельных конвейеров на тактовую частоту. А ATi умножает число текстурных блоков на тактовую частоту. В принципе, оба способа корректны, поскольку nVidia использует по одному текстурному блоку на блок пиксельных шейдеров (то есть по одному на пиксельный конвейер).
С учётом данных определений позвольте двинуться дальше и обсудить наиболее важные функции графического процессора, что они делают и почему они столь значимы.
Архитектура графического процессора: функции
Реализм 3D-графики очень сильно зависит от производительности видеокарты. Чем больше блоков пиксельных шейдеров содержит процессор и чем выше частота, тем больше эффектов можно наложить на 3D-сцену, чтобы улучшить её визуальное восприятие.
Графический процессор содержит много различных функциональных блоков. По количеству некоторых компонентов можно оценить, насколько графический процессор мощный. Перед тем, как двигаться дальше, позвольте рассмотреть самые важные функциональные блоки.
Вершинные процессоры (блоки вершинных шейдеров)
Как и блоки пиксельных шейдеров, вершинные процессоры выполняют код программ-шейдеров, которые касаются вершин. Поскольку больший бюджет вершин позволяет создавать более сложные 3D-объекты, производительность вершинных процессоров очень важна в 3D-сценах со сложными объектами или с большим их количеством. Впрочем, блоки вершинных шейдеров всё же не так очевидно влияют на производительность, как пиксельные процессоры.
Пиксельные процессоры (блоки пиксельных шейдеров)
Пиксельный процессор — это компонент графического чипа, выделенный на обработку пиксельных программ-шейдеров. Эти процессоры выполняют вычисления, касающиеся только пикселей. Поскольку пиксели содержат информацию о цвете, пиксельные шейдеры позволяют достичь впечатляющих графических эффектов. Например, большинство эффектов воды, которые вы видели в играх, создаётся с помощью пиксельных шейдеров. Обычно число пиксельных процессоров используется для сравнения пиксельной производительности видеокарт. Если одна карта оснащена восемью блоками пиксельных шейдеров, а другая — 16 блоками, то вполне логично предположить, что видеокарта с 16 блоками будет быстрее обрабатывать сложные пиксельные программы. Также следует учитывать и тактовую частоту, но сегодня удвоение числа пиксельных процессоров эффективнее по энергопотреблению, чем удвоение частоты графического чипа.
Унифицированные шейдеры
Унифицированные (единые) шейдеры ещё не пришли в мир ПК, но грядущий стандарт DirectX 10 как раз опирается на подобную архитектуру. То есть структура кода вершинных, геометрических и пиксельных программ будет единая, хотя шейдеры будут выполнять разную работу. Новую спецификацию можно посмотреть в Xbox 360, где графический процессор был специально разработан ATi для Microsoft. Будет весьма интересно увидеть, какой потенциал несёт новый DirectX 10.
Блоки наложения текстур (Texture Mapping Unit, TMU)
Текстуры следует выбрать и отфильтровать. Эта работа выполняется блоками наложения текстур, которые работают совместно с блоками пиксельных и вершинных шейдеров. Работа TMU заключается в применении текстурных операций над пикселями. Число текстурных блоков в графическом процессоре часто используется для сравнения текстурной производительности видеокарт. Вполне разумно предположить, что видеокарта с большим числом TMU даст более высокую текстурную производительность.
Блоки растровых операций (Raster Operator Unit, ROP)
Процессоры растровых операций отвечают за запись пиксельных данных в память. Скорость, с которой выполняется эта операция, является скоростью заполнения (fill rate). В ранние дни 3D-ускорителей число ROP и скорость заполнения являлись очень важными характеристиками видеокарт. Сегодня работа ROP по-прежнему важна, но производительность видеокарты уже не упирается в эти блоки, как было раньше. Поэтому производительность (и число) ROP уже редко используется для оценки скорости видеокарты.
Конвейеры
Конвейеры используются для описания архитектуры видеокарт и дают вполне наглядное представление о производительности графического процессора.
Конвейер нельзя считать строгим техническим термином. В графическом процессоре используются разные конвейеры, которые выполняют отличающиеся друг от друга функции. Исторически под конвейером понимали пиксельный процессор, который был подключён к своему блоку наложения текстур (TMU). Например, у видеокарты Radeon 9700 используется восемь пиксельных процессоров, каждый из которых подключён к своему TMU, поэтому считают, что у карты восемь конвейеров.
Но современные процессоры описать числом конвейеров весьма сложно. По сравнению с предыдущими дизайнами, новые процессоры используют модульную, фрагментированную структуру. Новатором в этой сфере можно считать ATi, которая с линейкой видеокарт X1000 перешла на модульную структуру, что позволило достичь прироста производительности через внутреннюю оптимизацию. Некоторые блоки процессора используются больше, чем другие, и для повышения производительности графического процессора ATi постаралась найти компромисс между числом нужных блоков и площадью кристалла (её нельзя очень сильно увеличивать). В данной архитектуре термин «пиксельный конвейер» уже потерял своё значение, поскольку пиксельные процессоры уже не подключены к собственным блокам TMU. Например, у графического процессора ATi Radeon X1600 есть 12 блоков пиксельных шейдеров и всего четыре блока наложения текстур TMU. Поэтому нельзя говорить, что в архитектуре этого процессора есть 12 пиксельных конвейеров, как и говорить, что их всего четыре. Впрочем, по традиции пиксельные конвейеры всё ещё упоминают.
С учётом сказанных допущений, число пиксельных конвейеров в графическом процессоре часто используют для сравнения видеокарт (за исключением линейки ATi X1x00). Например, если взять видеокарты с 24 и 16 конвейерами, то вполне разумно предположить, что карта с 24 конвейерами будет быстрее.
Архитектура графического процессора: технология
Техпроцесс
Под этим термином понимают размер одного элемента (транзистора) чипа и точность процесса производства. Совершенствование техпроцессов позволяет получить элементы меньших размеров. Например, техпроцесс 0,18 мкм даёт элементы большего размера, чем 0,13-мкм техпроцесс, поэтому он не такой эффективный. Транзисторы меньшего размера работают от меньшего напряжения. В свою очередь, снижение напряжения приводит к уменьшению теплового сопротивления, что даёт снижение количества выделяемого тепла. Совершенствование техпроцесса позволяет уменьшить расстояние между функциональными блоками чипа, а на передачу данных требуется меньше времени. Сокращение расстояний, понижение напряжения и другие улучшения позволяют достигать более высоких тактовых частот.
Несколько усложняет понимание то, что для обозначения техпроцесса сегодня используют как микрометры (мкм), так и нанометры (нм). На самом деле всё очень просто: 1 нанометр равен 0,001 микрометру, поэтому 0,09-мкм и 90-нм техпроцессы — это одно и то же. Как уже отмечалось выше, меньший техпроцесс позволяет получить более высокие тактовые частоты. Например, если сравнивать видеокарты с чипами 0,18 мкм и 0,09 мкм (90 нм), то вполне разумно ожидать от 90-нм карты более высокой частоты.
Тактовая частота графического процессора
Тактовая частота графического процессора измеряется в мегагерцах (МГц), то есть в миллионах тактов за секунду.
Тактовая частота напрямую влияет на производительность графического процессора. Чем она выше, тем больше работы можно выполнить за секунду. Для первого примера возьмём видеокарты nVidia GeForce 6600 и 6600 GT: графический процессор 6600 GT работает на частоте 500 МГц, а у обычной карты 6600 — на 400 МГц. Поскольку процессоры технически идентичны, 20% прирост тактовой частоты 6600 GT приводит к более высокой производительности.
Но тактовая частота — это ещё далеко не всё. Следует учитывать, что на производительность очень сильно влияет архитектура. Для второго примера возьмём видеокарты GeForce 6600 GT и GeForce 6800 GT. Частота графического процессора 6600 GT составляет 500 МГц, но 6800 GT работает всего на 350 МГц. А теперь примем во внимание, что у 6800 GT используются 16 пиксельных конвейеров, а у 6600 GT — только восемь. Поэтому 6800 GT с 16 конвейерами на 350 МГц даст примерно такую же производительность, как процессор с восемью конвейерами и удвоенной тактовой частотой (700 МГц). С учётом сказанного, тактовую частоту вполне можно использовать для сравнения производительности.
Локальная видеопамять
Память видеокарты очень сильно влияет на производительность. Но разные параметры памяти влияют по-разному.
Объём видеопамяти
Объём видеопамяти, наверное, можно назвать параметром видеокарты, который больше всего переоценивают. Неопытные потребители часто используют объём видеопамяти для сравнения разных карт между собой, но в реальности объём слабо влияет на производительность по сравнению с такими параметрами, как частота шины памяти и интерфейс (ширина шины).
В большинстве случаев карта со 128 Мбайт видеопамяти будет работать почти так же, как карта с 256 Мбайт. Конечно, есть ситуации, когда больший объём памяти приводит к увеличению производительности, но следует помнить, что больший объём памяти не будет автоматически приводить к росту скорости в играх.
Где объём бывает полезен, так это в играх с текстурами высокого разрешения. Игровые разработчики прилагают к игре несколько наборов текстур. И чем больше памяти будет на видеокарте, тем более высокое разрешение могут иметь загружаемые текстуры. Текстуры высокого разрешения дают более высокую чёткость и детализацию в игре. Поэтому вполне разумно брать карту с большим объёмом памяти, если все другие критерии совпадают. Ещё раз напомним, что ширина шины памяти и её частота намного сильнее влияют на производительность, чем объём физической памяти на карте.
Ширина шины памяти
Ширина шины памяти — один из самых важных аспектов производительности памяти. Современные шины имеют ширину от 64 до 256 бит, а в некоторых случаях даже 512 бит. Чем шире шина памяти, тем больше информации она может передать за такт. А это напрямую влияет на производительность. Например, если взять две шины с равными частотами, то теоретически 128-битная шина передаст в два раза больше данных за такт, чем 64-битная. А 256-битная шина — ещё в два раза больше.
Более высокая пропускная способность шины (выражается в битах или байтах в секунду, 1 байт = 8 бит) даёт более высокую производительность памяти. Именно поэтому шина памяти намного важнее, чем её объём. При равных частотах 64-битная шина памяти работает со скоростью всего 25% от 256-битной!
Возьмём следующий пример. Видеокарта со 128 Мбайт видеопамяти, но с 256-битной шиной даёт намного более высокую производительность памяти, чем 512-Мбайт модель с 64-битной шиной. Важно отметить, что у некоторых карт из линейки ATi X1x00 производители указывают спецификации внутренней шины памяти, но нас интересуют параметры внешней шины. Например, у X1600 внутренняя кольцевая шина имеет ширину 256 бит, но внешняя — всего 128 бит. И в реальности шина памяти работает со 128-битной производительностью.
Типы памяти
Память можно разделить на две основные категории: SDR (одиночная передача данных) и DDR (удвоенная передача данных), при которой данные передаются за такт в два раза быстрее. Сегодня технология одиночной передачи SDR устарела. Поскольку у памяти DDR данные передаются в два раза быстрее, чем у SDR, важно помнить, что у видеокарт с памятью DDR чаще всего указывают удвоенную частоту, а не физическую. Например, если у памяти DDR указана частота 1000 МГц, то это эффективная частота, при которой должна работать обычная память SDR, чтобы дать такую же пропускную способность. А на самом деле физическая частота составляет 500 МГц.
По этой причине многие удивляются, когда для памяти их видеокарты указана частота 1200 МГц DDR, а утилиты сообщают о 600 МГц. Так что придётся привыкнуть. Память DDR2 и GDDR3/GDDR4 работает по такому же принципу, то есть с удвоенной передачей данных. Различие между памятью DDR, DDR2, GDDR3 и GDDR4 кроется в технологии производства и некоторых деталях. DDR2 может работать на более высоких частотах, чем память DDR, а DDR3 — ещё на более высоких, чем DDR2.
Частота шины памяти
Подобно процессору, память (или, точнее, шина памяти) работает на определённых тактовых частотах, измеряемых в мегагерцах. Здесь повышение тактовых частот напрямую влияет на производительность памяти. И частота шины памяти является одним из параметров, которые используют для сравнения производительности видеокарт. Например, если все другие характеристики (ширина шины памяти и т.д.) будут одинаковыми, то вполне логично утверждать, что видеокарта с 700-МГц памятью работает быстрее, чем с 500-МГц.
Опять же, тактовая частота — это ещё не всё. 700-МГц память с 64-битной шиной будет работать медленнее, чем 400-МГц память со 128-битной шиной. Производительность 400-МГц памяти на 128-битной шине примерно соответствует 800-МГц памяти на 64-битной шине. Следует также помнить, что частоты графического процессора и памяти — совершенно разные параметры, и обычно они различаются.
Интерфейс видеокарты
Все данные, передаваемые между видеокартой и процессором, проходят через интерфейс видеокарты. Сегодня для видеокарт используется три типа интерфейсов: PCI, AGP и PCI Express. Они различаются пропускной способностью и другими характеристиками. Понятно, что чем выше пропускная способность, тем выше и скорость обмена. Впрочем, высокую пропускную способность могут использовать только самые современные карты, да и то лишь частично. В какой-то момент скорость интерфейса перестала быть «узким местом», её сегодня попросту достаточно.
Самая медленная шина, для которой выпускались видеокарты, это PCI (Peripheral Components Interconnect). Если не вдаваться в историю, конечно. PCI действительно ухудшала производительность видеокарт, поэтому они перешли на интерфейс AGP (Accelerated Graphics Port). Но даже спецификации AGP 1.0 и 2x ограничивали производительность. Когда стандарт увеличил скорость до уровня AGP 4x, мы начали приближаться к практическому пределу пропускной способности, которую могут задействовать видеокарты. Спецификация AGP 8x ещё раз удвоила пропускную способность по сравнению с AGP 4x (2,16 Гбайт/с), но ощутимого прироста графической производительности мы уже не получили.
Самая новая и скоростная шина — PCI Express. Новые графические карты обычно используют интерфейс PCI Express x16, который сочетает 16 линий PCI Express, дающих суммарную пропускную способность 4 Гбайт/с (в одном направлении). Это в два раза больше, чем пропускная способность AGP 8x. Шина PCI Express даёт упомянутую пропускную способность для обоих направлений (передача данных на видеокарту и с неё). Но скорости стандарта AGP 8x было уже достаточно, поэтому мы пока не встречали ситуации, когда переход на PCI Express дал прирост производительности по сравнению с AGP 8x (если другие аппаратные параметры одинаковы). Например, AGP-версия GeForce 6800 Ultra будет работать идентично 6800 Ultra для PCI Express.
Сегодня лучше всего покупать карту с интерфейсом PCI Express, он продержится на рынке ещё несколько лет. Самые производительные карты уже не выпускаются с интерфейсом AGP 8x, и решения PCI Express, как правило, найти уже легче аналогов AGP, да и стоят они дешевле.
Решения на нескольких видеокартах
Использовать несколько видеокарт для увеличения графической производительности — идея не новая. В ранние дни 3D-графики копания 3dfx вышла на рынок с двумя видеокартами, работающими параллельно. Но с исчезновением 3dfx технология совместной работы нескольких потребительских видеокарт была предана забвению, хотя ATi выпускала подобные системы для профессиональных симуляторов ещё с выхода Radeon 9700. Пару лет назад технология вернулась на рынок: с появлением решений nVidia SLI и, чуть позднее, ATi Crossfire.
Совместное использование нескольких видеокарт даёт достаточную производительность, чтобы вывести игру с высокими настройками качества в высоком разрешении. Но выбирать то или иное решение не так просто.
Начнём с того, что решения на основе нескольких видеокарт требуют большое количество энергии, поэтому блок питания должен быть достаточно мощным. Всё это тепло придётся отводить от видеокарты, поэтому нужно обратить внимание на корпус ПК и охлаждение, чтобы система не перегрелась.
Кроме того, помните, что SLI/CrossFire требует соответствующей материнской платы (либо под одну технологию, либо под другую), которая обычно стоит дороже по сравнению со стандартными моделями. Конфигурация nVidia SLI будет работать только на определённых платах nForce4, а карты ATi CrossFire — только на материнских платах с чипсетом CrossFire или на некоторых моделях Intel. Ситуацию осложняет и то, что некоторые конфигурации CrossFire требуют, чтобы одна из карт была специальной: CrossFire Edition. После выхода CrossFire для некоторых моделей видеокарт ATi разрешила включать технологию совместной работы по шине PCI Express, причём с выходами новых версий драйверов число возможных комбинаций увеличивается. Но всё же аппаратный CrossFire с соответствующей картой CrossFire Edition даёт более высокую производительность. Но и карты CrossFire Edition стоят дороже обычных моделей. На данный момент вы можете включить программный режим CrossFire (без карты CrossFire Edition) на видеокартах Radeon X1300, X1600 и X1800 GTO.
Следует учитывать и другие факторы. Хотя две графические карты, работающие совместно, и дают прирост производительности, ему далеко до двукратного. Но денег-то вы отдадите в два раза больше. Чаще всего прирост производительности составляет 20-60%. А в некоторых случаях из-за дополнительных вычислительных расходов на согласование прироста нет вообще. По этой причине конфигурации на нескольких картах вряд ли оправдывают себя с дешёвыми моделями, поскольку более дорогая видеокарта, как правило, всегда обгоняет пару дешёвых карт. В общем, для большинства потребителей брать решение SLI/CrossFire смысла не имеет. Но если вы хотите включить все опции улучшения качества или играть в экстремальных разрешениях, например, 2560×1600, когда надо просчитывать больше 4 миллионов пикселей на кадр, то без двух или четырёх спаренных видеокарт не обойтись.
Визуальные функции
Кроме чисто аппаратных спецификаций, различные поколения и модели графических процессоров могут отличаться набором функций. Например, часто говорят о том, что карты поколения ATi Radeon X800 XT совместимы с Shader Model 2.0b (SM), в то время как nVidia GeForce 6800 Ultra совместима с SM 3.0, хотя их аппаратные спецификации близки друг к другу (16 конвейеров). Поэтому многие потребители делают выбор в пользу того или иного решения, даже не зная, что означает это различие.
Microsoft DirectX и версии Shader Model
Эти названия чаще всего используют в спорах, но мало кто знает, что они означают на самом деле. Чтобы разобраться, давайте начнём с истории графических API. DirectX и OpenGL — это графические API, то есть интерфейсы прикладного программирования (Application Programming Interface) — открытые стандарты кода, доступные каждому.
До появления графических API каждый производитель графических процессоров использовал собственный механизм общения с играми. Разработчикам приходилось писать отдельный код для каждого графического процессора, который они хотели поддержать. Очень дорогой и не эффективный подход. Для решения этой проблемы были разработаны API для 3D-графики, чтобы разработчики писали код под конкретный API, а не под ту или иную видеокарту. После чего проблемы совместимости легли уже на плечи производителей видеокарт, которым пришлось гарантировать, что драйверы будут совместимы с API.
Единственной сложностью остаётся то, что сегодня используются два разных API, а именно Microsoft DirectX и OpenGL, где GL расшифровывается как Graphics Library (графическая библиотека). Поскольку API DirectX сегодня в играх более популярен, мы сконцентрируемся именно на нём. Да и на развитие игр этот стандарт повлиял сильнее.
DirectX — это создание Microsoft. В действительности, в DirectX входит несколько API, только один из которых используется для 3D-графики. DirectX включает API для звука, музыки, устройств ввода и т.д. За 3D-графику в DirectX отвечает API Direct3D. Когда говорят о видеокартах, то имеют в виду именно его, поэтому в данном отношении понятия DirectX и Direct3D взаимозаменяемы.
DirectX периодически обновляется, по мере того, как графические технологии продвигаются вперёд, а игровые разработчики внедряют новые методы программирования игр. Поскольку популярность DirectX быстро возросла, производители графических процессоров начали подгонять выпуск новых продуктов под возможности DirectX. По этой причине видеокарты часто привязывают к аппаратной поддержке того или иного поколения DirectX (DirectX 8, 9.0 или 9.0c).
Ситуацию усложняет и то, что части API Direct3D могут меняться со временем, без смены поколений DirectX. Например, в спецификации DirectX 9.0 указана поддержка Pixel Shader 2.0. Но обновление DirectX 9.0c включает Pixel Shader 3.0. Таким образом, хотя карты относятся к классу DirectX 9, они могут поддерживать разные наборы функций. Например, Radeon 9700 поддерживает Shader Model 2.0, а Radeon X1800 — Shader Model 3.0, хотя обе карты можно отнести к поколению DirectX 9.
Помните, что при создании новых игр разработчики учитывают владельцев старых машин и видеокарт, так как если игнорировать этот сегмент пользователей, то уровень продаж будет ниже. По этой причине в игры встраивается несколько путей кода. У игры класса DirectX 9 наверняка есть для совместимости путь DirectX 8 и даже путь DirectX 7. Обычно, если выбирается старый путь, то в игре исчезают некоторые виртуальные эффекты, которые есть на новых видеокартах. Но, по крайней мере, можно играть даже на старом «железе».
Многие новые игры требуют установки новейшей версии DirectX, даже если видеокарта относится к предыдущему поколению. То есть новая игра, которая будет использовать путь DirectX 8, всё равно требует установки новейшей версии DirectX 9 для видеокарты класса DirectX 8.
Каковы же различия между разными версиями API Direct3D в DirectX? Ранние версии DirectX — 3, 5, 6 и 7 — были относительно просты по возможностям API Direct3D. Разработчики могли выбирать визуальные эффекты из списка, после чего проверять их работу в игре. Следующим важным шагом в программировании графики стал DirectX 8. В нём появилась возможность программировать видеокарту с помощью шейдеров, поэтому разработчики впервые получили свободу программировать эффекты так, как им нужно. DirectX 8 поддерживал версии Pixel Shader от 1.0 до 1.3 и Vertex Shader 1.0. DirectX 8.1, обновлённая версия DirectX 8, получила Pixel Shader 1.4 и Vertex Shader 1.1.
В DirectX 9 можно создавать ещё более сложные программы-шейдеры. DirectX 9 поддерживает Pixel Shader 2.0 и Vertex Shader 2.0. DirectX 9c, обновлённая версия DirectX 9, включила спецификацию Pixel Shader 3.0.
DirectX 10, грядущая версия API, будет сопровождать новую версию Windows Vista. На Windows XP установить DirectX 10 не получится.
HDR-освещение и OpenEXR HDR
HDR расшифровывается как «High Dynamic Range», высокий динамический диапазон. Игра с HDR-освещением может дать намного более реалистичную картинку, чем игра без такового, причём не все видеокарты поддерживают HDR-освещение.
Перед появлением видеокарт класса DirectX 9 графические процессоры были серьёзно ограничены точностью вычислений освещения. До сих пор освещение можно было рассчитывать только с 256 (8 бит) внутренними уровнями.
Когда появились видеокарты класса DirectX 9, они получили возможность выдавать освещение с высокой точностью — полные 24 бита или 16,7 млн. уровней.
С 16,7 млн. уровней и после того, как был сделан следующий шаг по производительности видеокарт класса DirectX 9/Shader Model 2.0, на компьютерах стало возможным и HDR-освещение. Это довольно сложная технология, и смотреть её нужно в динамике. Если говорить простыми словами, то HDR-освещение увеличивает контрастность (тёмные оттенки выглядят темнее, светлые — светлее), в то же время повышая количество деталей освещения на тёмных и светлых областях. Игра с HDR-освещением кажется более живой и реалистичной, чем без него.
Графические процессоры, соответствующие последней спецификации Pixel Shader 3.0, позволяют рассчитывать освещение с более высокой 32-битной точностью, а также выполнять смешение (blending) с плавающей запятой. Таким образом, видеокарты класса SM 3.0 могут поддерживать специальный метод HDR-освещения OpenEXR, специально разработанный для киноиндустрии.
Некоторые игры, которые поддерживают только HDR-освещение методом OpenEXR, не пойдут с HDR-освещением на видеокартах Shader Model 2.0. Впрочем, игры, которые не опираются на метод OpenEXR, будут работать на любой видеокарте DirectX 9. Например, Oblivion использует метод OpenEXR HDR и позволяет включать HDR-освещение только на новейших видеокартах, которые поддерживают спецификацию Shader Model 3.0. Например, nVidia GeForce 6800 или ATi Radeon X1800. Игры, которые используют 3D-движок Half-Life 2, та же Counter-Strike: Source и грядущая Half-Life 2: Aftermath, позволяют включать HDR-рендеринг на старых видеокартах DirectX 9, которые поддерживают только Pixel Shader 2.0. В качестве примеров можно привести линейку GeForce 5 или ATi Radeon 9500.
Наконец, следует учитывать, что все формы HDR-рендеринга требуют серьёзной вычислительной мощности и могут поставить даже самые мощные графические процессоры «на колени». Если вы хотите играть в новейшие игры с HDR-освещением, то без высокопроизводительной графики не обойтись.
Полноэкранное сглаживание
Полноэкранное сглаживание (сокращённо AA) позволяет устранить характерные «лесенки» на границах полигонов. Но следует учитывать, что полноэкранное сглаживание потребляет немало вычислительных ресурсов, что приводит к падению частоты кадров.
Сглаживание очень сильно зависит от производительности видеопамяти, поэтому скоростная видеокарта с быстрой памятью сможет просчитать полноэкранное сглаживание с меньшим ущербом для производительности, чем недорогая видеокарта. Сглаживание можно включать в различных режимах. Например, сглаживание 4x даст более качественную картинку, чем сглаживание 2x, но это будет большим ударом по производительности. Если сглаживание 2x удваивает горизонтальное и вертикальное разрешение, режим 4x его учетверяет.
Текстурная фильтрация
На все 3D-объекты в игре накладываются текстуры, причём, чем больше угол отображаемой поверхности, тем более искажённой будет выглядеть текстура. Чтобы устранить этот эффект, графические процессоры используют фильтрацию текстур.
Первый способ фильтрации назывался билинейным и давал характерные полоски, которые были не очень-то приятны глазу. Ситуация улучшилась с внедрением трилинейной фильтрации. Обе опции на современных видеокартах работают практически без ущерба производительности.
На сегодня самым лучшим способом фильтрации текстур является анизотропная фильтрация (AF). Подобно полноэкранному сглаживанию, анизотропную фильтрацию можно включать на разных уровнях. Например, 8x AF даёт более высокое качество фильтрации, чем 4x AF. Как и полноэкранное сглаживание, анизотропная фильтрация требует определённой вычислительной мощности, которая увеличивается по мере повышения уровня AF.
Текстуры высокого разрешения
Все 3D-игры создаются с учётом конкретных спецификаций, и одно из таких требований определяет текстурную память, которая понадобится игре. Все нужные текстуры должны умещаться в память видеокарты во время игры, иначе производительность будет сильно падать, поскольку обращение за текстурой в оперативную память даёт немалую задержку, не говоря уже о файле подкачки на жёстком диске. Поэтому, если разработчик игры рассчитывает на 128 Мбайт видеопамяти как минимальное требование, то набор активных текстур не должен превышать 128 Мбайт в любое время.
У современных игр есть несколько наборов текстур, так что игра без проблем будет работать на старых видеокартах с меньшим количеством видеопамяти, а также и на новых картах с большим объёмом видеопамяти. Например, игра может содержать три набора текстур: для 128 Мбайт, 256 Мбайт и 512 Мбайт. Игр, которые поддерживают 512 Мбайт видеопамяти, сегодня очень мало, но они всё же являются самой объективной причиной для покупки видеокарты с таким объёмом памяти. Хотя увеличение объёма памяти практически не сказывается на производительности, вы получите улучшение визуального качества, если игра поддерживает соответствующий набор текстур.
Что нужно знать о видеокартах? Часть 2.