Шейдерная технология. Что такое шейдеры в играх.

Верхние тени используются для анимации фигур, травы и деревьев, создания волн на воде и многого другого. Вершинный шейдер предоставляет программисту данные, связанные с вершинами, такие как координаты вершины в пространстве, координаты ее текстуры, ее цвет и вектор нормали.

Шейдеры 3D-игр для начинающих

Хотите узнать, как добавить текстуры, освещение, тени, карты нормалей, светящиеся объекты, ambient occlusion и другие эффекты в вашу 3D-игру? Отлично! В этой статье представлен ряд техник затенения, которые могут улучшить графику вашей игры. Я объясняю каждую технику так, чтобы вы могли применить/перенести ее в любой стек инструментов, будь то Godot, Unity или любой другой.

Я решил использовать отличный игровой движок Panda3D и OpenGL Shading Language (GLSL) в качестве «клея» между затенениями. Если вы используете тот же стек, у вас есть дополнительное преимущество — вы научитесь использовать техники затенения именно в Panda3D и OpenGL.

Подготовка

Ниже приведена система, которую я использовал для разработки и тестирования кода примера.

Среда

Код примера был разработан и протестирован в следующей среде:

  • Linux manjaro 4.9.135-1-MANJARO.
  • Строка рендеринга OpenGL: GeForce GTX 970/PCIe/SSE2
  • Строка версии OpenGL: 4.6.0 NVIDIA 410.73
  • g++ (GCC) 8.2.1 20180831
  • Panda3D 1.10.1-1

Материалы

Каждый из материалов Blender, используемых для создания mill-scene.egg, имеет две текстуры.

Первая текстура — карта нормалей, вторая — карта диффузности. Если объект использует нормали своих вершин, применяется карта нормалей «solid blue». Поскольку все модели имеют одинаковые карты в одних и тех же местах, шейдеры можно обобщить и применить к корневому узлу графа сцены.

Обратите внимание, что граф сцены является функцией движка Panda3D.

Здесь представлена одноцветная карта нормалей, содержащая только цвета красный = 128, зеленый = 128, синий = 255.

Этот цвет обозначает единичную нормаль, направленную в положительном направлении оси z 0, 0, 1.

Здесь мы видим единичную нормаль 0, 0, 1, которая преобразуется в единичный синий цвет 128, 128, 255, и единичный синий цвет, преобразованный в единичную нормаль.

Более подробную информацию см. в разделе о технике наложения обычных карт.

Panda3D

В данном примере кода Panda3D используется в качестве «клея» между оттенками. Это не влияет на описанные ниже техники, то есть вы можете использовать полученные здесь знания на любом стеке или игровом движке. Panda3D предлагает некоторые удобства. Я описал их в статье, чтобы вы могли либо найти их аналог в своем стеке, либо воссоздать их самостоятельно, если их нет в вашем стеке.

Обратите внимание, что gl-coordinate-system default, textures-power-2 down и textures-auto-power-2 1 были добавлены в config.prc. Они не включены в конфигурацию Panda3D по умолчанию.

По умолчанию Panda3D использует систему координат по часовой стрелке с осью z, направленной вверх, а OpenGL использует систему координат по часовой стрелке с осью y, направленной вверх.

Используемая по умолчанию gl-coordinate-system позволяет избавиться от преобразований между двумя системами координат в пределах затенения.

textures-auto-power-2 1 позволяет нам использовать размеры текстур, которые не являются кратными двум, если система поддерживает их.

Это полезно при использовании SSAO или других техник внутри экрана/окна, так как размер экрана/окна обычно не равен двум.

textures-power-2 down уменьшает размер текстур до второго класса, если система поддерживает только текстуры с размером второго класса.

Сборка кода примера

Если вы хотите запустить код примера, его необходимо сначала создать.

Panda3D работает на Linux, Mac и Windows.

Linux

Начните с установки Panda3D SDK для вашего дистрибутива.

Узнайте, где находятся заголовки и библиотеки Panda3D. Скорее всего, они находятся в файлах /usr/include/panda3d/ и /usr/lib/panda3d/ соответственно.

Затем клонируйте этот репозиторий и перейдите в его каталог.

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git cd 3d-game-shaders-for-beginners

Теперь скомпилируйте исходный код в выходной файл.

g++ \ -c main.cxx \ -o 3d-game-shaders-for-begeginners.o \ -std=gnu++11 \ -O2 \ -I/usr/include/python2.7/ \ -I/usr/include/panda3d/

После создания выходного файла создайте исполняемый файл, соединив выходной файл с его зависимостями.

g++ \ 3d-game-shaders-for-beginners.o \ -o 3d-game-shaders-for-beginners \ -L/usr/lib/panda3d \ -lp3framework \ -lpanda \ -lpandafx \ -lpandaexpress \ -lp3dtoolconfig \ -lp3dtool \ -lp3pystub \ -lp3direct \ -lp3thread

Более подробную информацию вы можете найти в руководстве Panda3D.

Начните с установки Panda3D SDK для Mac.

Узнайте, где находятся заголовки и библиотеки Panda3D.

Затем клонируйте хранилище и перейдите в его каталог.

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git cd 3d-game-shaders-for-beginners

Теперь скомпилируйте исходный код в выходной файл. Вам нужно выяснить, где находятся каталоги include Python 2.7 и Panda3D.

clang++ \ -c main.cxx \ -o 3d-game-shaders-for-begeginners.o \ -std=gnu++11 \ -g \ -O2 \ -I/usr/include/python2.7/ \ -I/Developer/Panda3D/include/

После создания выходного файла создайте исполняемый файл, соединив выходной файл с его зависимостями.

Вам нужно выяснить, где находятся библиотеки Panda3D.

clang++ \ 3d-game-shaders-for-beginners.o \ -o 3d-game-shaders-for-beginners \ -L/Developer/Panda3D/lib \ -lp3framework \ -lpanda \ -lpandafx \ -lpandaexpress \ -lp3dtoolconfig \ -lp3dtool \ -lp3pystub \ -lp3direct \ -lpthread

Более подробную информацию вы можете найти в руководстве Panda3D.

Windows

Начните с установки Panda3D SDK для Windows.

Узнайте, где находятся заголовки и библиотеки Panda3D.

Клонируйте это хранилище и перейдите в его каталог.

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git cd 3d-game-shaders-for-beginners

Более подробную информацию вы можете найти в руководстве Panda3D.

Для точечного освещения, если масштабное произведение вектора источника фрагмента и вектора направления освещения меньше косинуса половины угла поля зрения источника освещения, то эффект от этого источника не будет учитываться в затенении.

Вершинный шейдер

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

Вершинный шейдер вставляет вершину в локальную систему координат, а шейдер должен вернуть освещенную (окрашенную) вершину в однородное пространство клипа. Обратите внимание, что пространство, в которое таблица проекций преобразует вершины, называется однородным пространством клипа. Поэтому для преобразования вершины из локального пространства в пространство однородного клипа необходимо выполнить следующую последовательность преобразований: Преобразование мира, преобразование поверхности и преобразование проекции, которые выполняются с использованием таблицы мира, таблицы поверхности и таблицы проекции соответственно. Для точечных примитивов вершинные шейдеры также могут быть использованы для управления размерами. Поскольку вершинные шейдеры — это программы, которые вы пишете сами (на языке HLSL), они открывают множество возможностей для реализации различных графических эффектов. Например, с вершинными шейдерами можно применить любой алгоритм освещения, реализованный в коде шейдера. Мы больше не ограничены фиксированными алгоритмами освещения, реализованными в Direct3D. Кроме того, возможность управлять положением вершин может использоваться для многих других задач, таких как моделирование одежды, управление размером точек для систем частиц, смешивание вершин и морфинг. Кроме того, структура данных вершин в программируемом конвейере более гибкая и может содержать больше данных, чем в фиксированном конвейере. Пиковые шейдеры являются относительно новой функцией и не поддерживаются многими видеокартами, особенно новыми версиями шейдеров, реализованными в DirectX 9. Чтобы проверить, какую версию шейдера поддерживает ваша видеокарта, проверьте терм VertexShaderVersion в структуре D3DCAPS9 с помощью макроса D3DVS_VERSION.

Геометрический шейдер

Геометрический шейдер — программы затенения, выполняемые на этапе конвейеризации геометрического шейдера. Затенение геометрии работает с вершинными данными, но выполняется сразу для элемента геометрии. Его задача — обрабатывать поступающие примитивы (точки, линии, треугольники) и создавать новые примитивы по мере необходимости. Импортируя геометрический шейдер, разработчик может работать с группой элементов — например, со всеми вершинами редактируемого треугольника или даже со смежными вершинами — и создавать множество новых примитивов, выполняя один шейдер в Universal Shader Processor.

Геометрическое затенение является неотъемлемой частью API DirectX 10 от Microsoft. Этот API доступен только в Windows Vista, поэтому все новые возможности G80 (и грядущего R600) могут быть использованы только в Windows Vista. Есть три параметра для выполнения затенения геометрии: первичный тип ввода, первичный тип вывода и максимальное количество создаваемых вершин. Эти параметры являются свойствами объекта программы. Максимальное количество создаваемых вершин определяет, сколько вершин может создать шейдер геометрии за один вызов. Если шейдер создает больше вершин, чем это количество во время выполнения, они могут не попасть в конвейер.

Пиксельный шейдер

Пиксельный шейдер (или программа фрагментов в OpenGL) — это программа для этапа пиксельного шейдера конвейера. Пиксельный шейдер выполняется для каждого фрагмента геометрии в растровой форме. Как правило, пиксельный шейдер обрабатывает затенение геометрического объекта — наложение текстуры, освещение и различные текстурные эффекты, такие как отражение, преломление и туман. Пиксельные шейдеры также используются для постэффектов. Пиксельные шейдеры, эффекты которых видны сразу, не могут быть заменены. Он выполняет обработку цветовых данных, генерируемых при рендеринге треугольника. Работает с текстурами и цветами. Количество команд сильно ограничено, например, в версии 1.4 оно не может превышать 32. Пиксельные шейдеры, представленные в NV20, уже были способны на большее, чем простое мультитекстурирование, хотя большинство игр использовали традиционное мультитекстурирование только на большинстве поверхностей и применяли более сложные пиксельные шейдеры только на части поверхностей для создания различных спецэффектов (все знают, что вода по-прежнему является самым распространенным примером использования пиксельных шейдеров в играх). С появлением SM3 и графических чипов, которые их поддерживают, возможности пиксельных шейдеров выросли до такой степени, что они могут даже выполнять трассировку лучей, хотя и с некоторыми ограничениями в настоящее время. Пиксельные шейдеры — это рельефные стены и естественное освещение (в том числе — динамическое, и множественные источники света), рябь на воде и сияющий свет на металлических и стеклянных поверхностях, очень реалистичные изогнутые поверхности и разнообразные спецэффекты. Невозможно перечислить все! Возможно, наиболее очевидное и явное применение тени (водной поверхности

С вычислительной точки зрения, пиксельный шейдер обычно определяет модель для вычисления освещенности одной точки изображения. Но опять же, речь идет не только об освещении: пиксельные шейдеры также могут автоматически создавать текстуры (стилизованное дерево или вода, или мерцание на дне ручья, создаваемое рябью на поверхности). И текстуры, которые меняются со временем, не теряя деталей, даже когда вы приближаетесь к ним вплотную. Или создать визуальные эффекты — дрожащий воздух, разбитое стекло. Конечно, пиксельный шейдер не столько вычисляет, сколько изменяет предварительно вычисленный цвет, поэтому даже если поддержка пиксельного шейдера отсутствует, ускоритель все равно сможет обеспечить производительность. Поскольку нагрузка на блоки шейдинга гораздо выше, а сами блоки обычно больше, программные ограничения здесь гораздо жестче, чем в случае с пиковыми шейдерами. В дополнение к числовым командам существуют специальные команды «текстуры», которые выполняют выборку цвета и числовые расчеты для определенных текстур. Различия между версиями пиксельных шейдеров примерно такие же, как и между вершинными шейдерами. Главная особенность пиксельных шейдеров заключается в том, что они поддерживают числа с плавающей запятой. Это очень важно в приложениях для освещения: динамический диапазон стандартного 8-битного цвета может оказаться недостаточным для воспроизведения богатства красок. Теперь в Pixel Shader, версии 3, включена поддержка условных типов освещения, практически бесполезная функция, но позволяющая в некоторых случаях оптимизировать производительность шейдера (например, не считать заведомо неопределенные пиксели).

Примечания. Это курс промежуточного уровня, который предполагает, что вы уже знаете основы Unity. Если вы новичок в Unity, вам следует начать с курса «Введение в Unity: начало работы».

Графический пайплайн

Преимущество программируемого конвейера по сравнению с его предшественником заключается в том, что теперь разработчики могут создавать собственные алгоритмы, а не использовать жестко заданный набор опций.

Первоначально видеокарты оснащались несколькими специализированными процессорами, которые поддерживали различные наборы инструкций. Шейдеры были разделены на три типа, в зависимости от процессора, который будет их выполнять. Однако позже видеокарты стали оснащаться процессорами общего назначения, которые поддерживали наборы инструкций для всех трех типов шейдеров. Разделение шейдеров на типы было сохранено для описания назначения шейдера.

С этими интеллектуальными графическими картами появилась возможность выполнять общие (не связанные с графикой) вычисления на графическом процессоре в дополнение к графическим задачам.

Впервые полная поддержка шейдеров появилась на видеокартах серии GeForce-3, но основные функции уже были реализованы на GeForce256 (в виде Register Combiners).

Виды шейдеров

В зависимости от стадии конвейера шейдеры делятся на различные типы: Вершинный, Фрагмент (пиксельный) и Геометрический. Более новые типы имеют шейдеры с тесселяцией. Мы не будем подробно обсуждать графический конвейер. Я все еще рассматриваю возможность написания отдельной статьи об этом, для тех, кто решил изучать шейдеры и программирование графики. Напишите мне в комментариях, если вам интересно, и я узнаю, стоит ли это делать.

Вершинный шейдер

Верхние тени используются для анимации фигур, травы и деревьев, создания волн на воде и многого другого. Вершинный шейдер предоставляет программисту данные, связанные с вершинами, такие как координаты вершины в пространстве, координаты ее текстуры, ее цвет и вектор нормали.

Геометрический шейдер

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

Пиксельный шейдер

Пиксельные шейдеры выполняют наложение текстур, освещение и различные текстурные эффекты, такие как отражение, преломление, туман, отображение неровностей и т.д. Пиксельные шейдеры также используются для постэффектов.

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

На чем пишут шейдеры?

Первоначально шейдеры могли быть написаны на языке, похожем на ассемблер, но позже появились высокоуровневые шейдерные языки, похожие на C, такие как Cg, GLSL и HLSL.

Такие языки намного проще языка C, потому что задачи, которые они решают, намного проще. Система типов в этих языках отражает потребности графических программистов. Поэтому они предоставляют программисту специальные типы данных: Таблицы, модели, векторы и т.д.

Примечания. Это курс промежуточного уровня, который предполагает, что вы уже знаете основы Unity. Если вы новичок в Unity, вам следует начать с курса «Введение в Unity: начало работы».

Версия шейдеров видеокарты: как узнать? Что такое шейдеры?

Версия шейдеров видеокарты: как узнать?

  • Загрузите программное обеспечение «GPU-Z». Его легко найти — просто введите его название в поисковую строку браузера. Поиск, загрузка, установка и запуск.
  • После запуска программы вы сразу увидите большое окно с тремя вкладками: «Graphics Card», «Sensors» и «GPU», «Sensors» и «Control». Обычно окно открывается с вкладкой «Графическая карта». Отображаются параметры вашей видеокарты.
  • Среди всех параметров вы должны найти поле с надписью «DirectX Support».
  • В поле «DirectX Support» вы найдете шейдеры, которые поддерживает ваша видеокарта!

Примером может быть следующее: «Поддержка DirectX: 10.0/SM4.0».

Значение. В вашем случае он может выглядеть несколько иначе, например, SM/1.4 или что-то еще, но индикатор SM остается тем же!

Что такое шейдеры и для чего нужны?

Шейдеры — это специальные программы, которые отвечают за производительность графических текстур в играх. Благодаря шейдерам во время игры можно наслаждаться удивительно реалистичными изображениями природных явлений, таких как капли росы или дождь. Это практически вся суть игры. Теперь перейдем к проблеме с шейдерами.

Видеокарта не поддерживает версию шейдеров

Проблема заключается в следующем: Вы купили или скачали игру и установили ее на свой компьютер. Вы потираете руки в предвкушении отличной игры, запускаете ярлык и получаете сообщение, что игра не может быть запущена, потому что ваша видеокарта не поддерживает ту или иную версию вершинных шейдеров.

Что ж, можно понять, почему игра не запускалась с сообщением: «Ваша видеокарта не поддерживает такую-то версию».

У пользователя сразу возникает вопрос: можно ли как-то скачать эти тени и установить их на видеокарту, как драйвера? К сожалению, скачать и установить тени не представляется возможным!

Дело в том, что сами тени встроены в вашу видеокарту при ее сборке. Все, что вы можете сделать, это заменить видеокарту на новую.

Узнать, какую версию шейдеров поддерживает ваша видеокарта, очень просто. А позже вы уже будете точно знать, какие игры можно устанавливать, а какие нет, основываясь на полученных данных.

Проведя несложный расчет по аналогии, мы обнаружили, что критерием для компьютерного оборудования, попадающего в категорию «старого», может быть период в восемь лет. Конечно, расчет довольно юмористический, но все же.

Как узнать какие шейдеры поддерживает моя видеокарта

Самый простой способ сделать это — установить бесплатную утилиту GPU-Z. Необходимая информация отображается в поле Поддержка DirectX. Это номер в поле SM — например, 2.0 (старая версия) или 3.0 (подходит для современных игр). Последние модели видеокарт уже поддерживают четвертую версию шейдеров.

При покупке видеокарты также обратите внимание на количество шейдеров и их частоту. Принцип прост: чем выше эти показатели, тем лучше.

Вам могут быть полезны следующие статьи: «Что такое HDCP на видеокарте?» и «Что означает Dual на этикетке видеокарты и что это значит для клиента?». Я буду благодарен, если вы поделитесь этим сообщением в социальных сетях. До скорой встречи!

Unity предоставляет tex2D для поиска цвета в текстуре по определенной координате. При написании фрагментного шейдера необходимо явно включить библиотеку шейдеров Unity, но поверхностные шейдеры включают библиотеку автоматически.

Добавление цвета вершин в шейдер поверхности

Первая проблема, которую вы хотели решить в этой сцене, заключалась в том, что у острова были жесткие угловатые края.

Теперь края сетки хорошо видны, но реальные пляжи как будто сливаются с цветом воды.

В игре есть много способов добиться этого, но простой подход использует цвет вершин.

Чтобы понять, что такое цвета вершин, представьте, что «вершина» — это просто набор данных. Эти данные всегда содержат позицию вершины, но вы также можете добавить дополнительные параметры.

Координаты текстуры — это обычное дополнение, причем координаты (обозначенные UV вместо XY) представляют собой числа, которые вы используете при работе с текстурами. Теперь цвет — это еще одна опция, которая предоставляет числа, используемые при расчете цветопередачи оттенка.

Например, если присвоить вершине красный цвет, то полигон, использующий эту вершину, будет иметь красный оттенок. Если вершины многоугольника имеют разные цвета, эти цвета интерполируются на грани многоугольника.

Цвета, интерполированные на грань треугольника

Эта островная сетка уже имеет цвета вершин, но вы не можете их увидеть, потому что стандартное затенение Unity не обрабатывает цвета вершин.

В частности, вершины под водой имеют более темный оттенок, а остальные вершины острова — белый. Эти цвета создали бы красивый градиент вдоль края пляжа, если бы они были видны, поэтому ваша следующая задача — написать собственный шейдинг, который будет обрабатывать цвет вершин.

Создание пользовательского шейдера для цвета вершин

Создайте новое затенение поверхности и назовите его LitVertexColor. Установите материал мультяшного песка на использование этого затенения, а затем откройте ресурс затенения, чтобы отредактировать код.

Вам нужно сделать только два небольших дополнения к цвету верхушек. Сначала добавьте следующий код в структуру ввода:

Затем включите vcolor в расчет цвета в surf:

И это все! Сохраните затенение и вернитесь к сцене Unity. После составления штриховки вы увидите, как края острова исчезают в воде.

Сцена песчанного острова со смешанными краями

Анимация текстуры воды

Теперь песок выглядит гораздо привлекательнее! Тем временем вы обнаружили еще одну проблему, а именно: вода полностью статична.

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

Создание неосвещенного шейдера

Вместо этого создайте Unlit Shader с помощью контекстного меню: Create > Shader > Неосвещенный шейдер .

Назовите новый актив шейдера CartoonWater и откройте его в редакторе кода.

Сначала обновите имя шейдера в верхней секции.

По умолчанию этот шейдер называется «Unlit/CartoonWater».. Изменив это имя на «Custom / CartoonWater», будет легче найти пользовательский шейдер в меню.

Затем добавьте несколько дополнительных свойств для затенения воды. Новое поле «Свойства» должно выглядеть следующим образом:

По умолчанию шейдер Unlit имеет только одно свойство текстуры _MainTex, поэтому вы добавили дополнительные свойства для управления непрозрачностью воды и движением текстуры поверхности.

Затем обновите раздел Labels и добавьте несколько новых параметров сразу после строки LOD 100:

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

Теперь обратите внимание на раздел CGPROGRAM с серией утверждений Pragma.

Если раньше вы работали с поверхностным шейдером, то теперь вы имеете дело с вершинным и фрагментным шейдерами. Если раньше директива #pragma объявляла функцию затенения поверхности, то теперь директива #pragma объявляет функции затенения вершин и фрагментов.

Также обратите внимание на директиву #include: Unity предоставляет здесь библиотеку полезных функций (введенных в этой строке для использования в затенении). Они выполняют такие полезные задачи, как создание текстурного узора и синхронизация.

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

unity варит полезные инструменты шейдеров

Файл UnityCG.cginc содержит предопределенные переменные Unity и вспомогательные функции.

Теперь посмотрите на включенные структуры:

На этот раз для шейдера поверхности используются две входные структуры вместо одной. Вы вводите первую структуру в вершинный шейдер, который выводит вторую структуру. Этот выход вершинного шейдера поступает на вход фрагментного шейдера.

Непосредственно под сэмплером2D _MainTex? Добавьте следующие новые свойства в основную строку кода Cg:

Как и в предыдущем Surface Shader, в коде Cg необходимо объявить все свойства как переменные. Вы будете использовать эти свойства для изменения текстуры и ее анимации в основной функции шейдера.

Теперь в основной функции фрагмента шейдера, в самом верху (над комментарием кода // выборка текстуры add:

Текстурирование использует УФ-координаты для присвоения цвета или другого вектора фрагменту. Значения U и V находятся между нулем и единицей. Каждой вершине присваивается UV, который выводится в вершинный шейдер.

Революция

Штриховка — это программа, которая визуально определяет поверхность объекта. Модуль затенения, в свою очередь, является частью графического процессора, предназначенного для выполнения таких программ.

Первым графическим процессором с аппаратной поддержкой затенения DirectX 8 был NV20 — основа видеокарты GeForce3. Первая версия (SM1) шейдеров была довольно простой — маленькая программа могла выполнять только ограниченное количество инструкций. Более длинные и сложные шейдеры SM2 с расширенным набором инструкций появились с выходом графического процессора R300 и видеокарт Radeon 9500/9700, которые поддерживали DirectX 9. Еще один толчок был дан шестыми моделями серии GeForce с поддержкой DirectX 9.0c и SM3.

450x305 13 KB

Что означала революция шейдеров, когда и до этого производительность и возможности увеличивались с каждым новым поколением видеокарт?

До GeForce 8800 GTX дискретные видеокарты использовали отдельные блоки вершинных и пиксельных шейдеров в GPU: блоки вершинных шейдеров выполняли математические операции над вершинами, составляющими 3D-объекты, а блоки пиксельных шейдеров выполняли инструкции по растеризации пикселей, составляющих изображение. Помимо унифицированных блоков выполнения шейдеров, новая архитектура предложила ряд других качественных и количественных улучшений, которые дали видеоядру новые возможности. Подробный обзор всех возможностей архитектуры G80 можно найти, например, в этой статье.

Важно отметить, что в прошлом только определенные блоки GPU могли использоваться для определенных типов затенения, в то время как блоки, предназначенные для других типов затенения, могли оставаться неиспользованными, что означает, что GPU не всегда мог использовать 100% своих возможностей.

С грядущими изменениями в DirectX 10 мощность шейдеров была значительно увеличена, что неизбежно привело к повышению нагрузки на GPU. Логично, что инженеры Nvidia рассмотрели сценарий, при котором некоторые из дорогостоящих транзисторов нового GPU будут простаивать, в то время как другие будут загружены работой, и построили новую архитектуру на глобальных процессорах, которые могут выполнять шейдеры любого типа.

450x354 38 KB. Big one: 1417x730 115 KB

Таким образом, резкий рост производительности по сравнению с DX9 флагманов Nvidia и ATI был достигнут не только за счет увеличения абсолютного числа транзисторов GPU, но и за счет качественных изменений в архитектуре, в чем можно усмотреть некоторую аналогию со вторым законом диалектики.

Видеокарты, поддерживающие только DirectX 10, а тем более DirectX 9, давно устарели и их можно с уверенностью отнести к категории «ретро». Давайте посмотрим, на что они способны?

Участники тестирования

Я попытался собрать флагманские видеокарты Nvidia, оснащенные интерфейсом PCI Express и поддерживающие DirectX 9/10, но с некоторыми оговорками. Прежде всего, предпочтение отдавалось видеокартам с одним GPU. Этого достаточно, чтобы сравнить производительность отдельных поколений архитектуры, за исключением того, что у меня, к сожалению, нет многопроцессорных моделей. Второе — в течение одного поколения предпочтение отдавалось, так сказать, «финальной» версии флагмана. Единственным исключением стала серия GeForce 7 — здесь представлены и 7800 GTX, и 7900 GTX.

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

Поэтому я представляю вам участников.

ASUS GeForce 6800 Ultra 512MB

450x253 50 KB. Big one: 1500x844 385 KB

Довольно редкая модификация 6800 Ultra, оснащенная видеопамятью объемом 512 Мбайт. Можете ли вы представить, что в 2005 году такая видеокарта стоила фантастические 849 долларов или даже больше? И это несмотря на то, что вскоре должен был появиться новый флагман!

Шестая серия видеокарт GeForce была впервые анонсирована в апреле 2004 года. Флагманом была модель 6800 Ultra с интерфейсом AGP 8X и частотой 400/1100 МГц. 130-нм графический процессор NV40 с 16 пиксельными процессорами и 6 вершинными процессорами был оснащен 256 МБ 256-битной видеопамяти B2B. Позже некоторые производители увеличили частоту GPU до 425 МГц. Это последний флагман компании Nvidia, изначально разработанный для интерфейса AGP.

PCI Express версия 6800 Ultra имела тот же графический процессор NV40 и мост HSI на той же подложке. Размещение прямо рядом с GPU, а не на плате, стало результатом более высокой производительности этой самопровозглашенной конструкции NV45.

450x450 51 KB. Big one: 850x850 274 KB

6800 Ultra в версии PCI Express в целом работала на тех же 425/1100 МГц, но только с 256 МБ видеопамяти. Опорные частоты для 512-Мбайт версии, похоже, были 400/1050 МГц, но некоторые производители решили эту проблему по-своему, выпустив варианты с частотами 425/1050 МГц и 425/1100 МГц. И мой пример — один из них — с повышенными частотами GPU и памяти.

Существует мнение, что пониженная частота памяти на 512-Мбайт видеокарте была вызвана повышенной нагрузкой на контроллер памяти. Возможно, в какой-то степени это и правда, но, на мой взгляд, довольно банально — если в 256-Мбайт версии тепло от всех восьми чипов памяти отводилось через кулеры, то в 512-Мбайт версии кулерами оснащена только половина из шестнадцати чипов.

В то же время, дополнительная память не только не повысила производительность, но и 512-Мбайт версия часто была медленнее 256-Мбайт версии, которая на момент анонса стоила 499 долларов.

Подписывайтесь на канал Яндекс.Дзен или Telegram-канал @overclockers_news, чтобы быть в курсе новых материалов на сайте. С фотографиями, подробным описанием и без рекламы.

Оцените статью
club-cs.ru