Меню

За что отвечают шейдеры в видеокарте



Что делают шейдеры GPU? Тонкости технологии

Что делают шейдеры GPU? Тонкости технологии

Что делают шейдеры GPU? — Это будет немного технический ответ, если вы знаете терминологию. Но все не так уж и сложно.

Шейдер GPU — это алгоритм рендеринга, который имеет большую гибкость. Графические шейдеры (если мы обсуждаем что то вроде PBR или Maya’s DX 11 shader с Viewport 2.0), они позволяют вам видеть ваши текстуры, а также позволяют редактировать свойства поверхности, такие как отражение, преломление и т. д. без автономного рендеринга.

Это означает, что все происходит в режиме реального времени редактирования. Прямо на вашем экране. За счет способности вашего процессора, который гораздо быстрее чем CPU, вы получите результат сразу. В режиме реального времени. На что бы у вас ушло гораздо больше времени при использовании ЦПУ.

Конечно, для этого требуется движок рендеринга.

[fusion_vimeo alignment=»center» width=»640″ height=»480″ autoplay=»false» api_params=»» hide_on_mobile=»small-visibility,medium-visibility,large-visibility» >

Maya: шейдеры реального времени CGFX

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

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

Что делают шейдеры GPU? — пример:

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

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

Источник

Сила шейдеров

Ivan_FCB об этой статье

К написанию этой статьи меня подтолкнул Foxtrot, в рамках обсуждения задания «Сила шейдеров». На коварный вопрос о возможности/невозможности использования карт с программной обрезкой конвейеров Вашему покорному слуге было предложено не выказывать восточную хитрость, обойдясь демонстрацией потенциала такого «финта ушами», с вероятностью огрести небольшой бонус для команды. Ну, а так как я весьма меркантильная сволочь, предложение было воспринято на «ура!».
Поясню, что моя видеокарта относится к последнему поколению графических процессоров nVidia с неунифицированной архитектурой. Т.е., на руках у меня чип G71, производившийся в рамках 90нм техпроцесса, у которого был отключен один квад пиксельных процессоров и один вершинный процессор. Итак, приветствуем/завидуем/жалеем меня – 7900GS, обладающая 5 пиксельными квадами (20 пиксельных процессоров) и 7 вершинными процессорами.
Логическую схему чипа можно увидеть на этой картинке:

Будучи не шибко просветленным, даже по прочтении кучи заумных статей об этой архитектуре, возможно, дальше я выскажу немало бреда. Но, может быть, я, при каком-то приближении, окажусь прав.
В принципе, схему работы этого чипа я представил так – процессор подает данные о рассчитываемой сцене на GPU. Блок вершинных процессоров рассчитывает треугольники для сцены, а пиксельные квады натягивают на рассчитанные треугольники текстуры. Т.о., можно сказать, что первым (в хронологическом порядке) фактором, который будет ограничивать производительность GPU, будет скорость работы вершинных процессоров – все-таки, именно с результатами его работы придется работать пиксельным конвейерам. (sic! я не умаляю важности того факта, что таким «бутылочным горлышком» может быть любой другой блок GPU, но, мне показалось оптимальным исходить именно от этой точки зрения).

Как это все начиналось.
Еще в самом начале обдумывания задания, которое, как мне кажется, было направлено на выявление самой эффективной архитектуры ГП для 3DMark05, я учитывал возможность отключить неэффективно работающие блоки, которые негативно сказываются на коэффициенте “Total Score/(ppu+vpu)”. Примечание: здесь и далее — PPU как «пиксельный процессор», VPU как «вершинный процессор». Плюс, отключение лишних процессоров приводило к тому, что появлялись предпосылки к избыточности пропускной способности памяти и блоков ROP, а так же возможность большего разгона.
Для начала, нужно было выявить то соотношение квадов ppu и vpu, при котором коэффициент бы достигал наилучших значений. Для этого карта была прошита частотами GPU=500MHz(delta=0), MEM=700MHz и оставлен только профиль для 3D, т.к. при наличии раздельных профилей для 2D/3D в GT3 бессистемно происходил сброс частот секунд за 7 до окончания теста, с соответствующим падением результата субтеста – бороться с этим явлением было лень, т.к. дело, скорее всего, в перегреве и соответствующем переходе в режим 2D/3D-low.

Читайте также:  Как в эвересте посмотреть какая видеокарта

Конфигурация:
1. Core 2 Duo E6400 (2MB L2, 266FSB) @ 3.52GHz (440 FSB) 1,625в
2. Abit IP35-E (Vnb=1,49, Vtt=1,45, PCI-E=115MHz, PL=6)
3. ApogeeGT DDRII-1066 @ 1056MHz 4-5-5-14-35 2,3в
4. Прочее из профиля
Программное обеспечение:
1. Windows XP SP2, урезанная посредством nLite.
2. ForceWare 163.71
3. NVStrap driver из состава RivaTuner 2.0 FR
4. Intel 8.5.0.1008
5. DirectX 9.0c с обновлениями от 08.2008.
6. 3DMark05 v.1.3.0 Professional

C целью реализации своих планов по «порабощению человечества», был придуман/одобрен следующий некислый алгоритм: отключать последовательно по одному вершинному конвейеру для каждой из 5 возможных комбинаций квадов PPU. Т.е., провести 35 прогонов теста и найти наиболее оптимальное соотношение активных блоков ppu и vpu для достижения наилучшего коэффициента и, руководствуясь результатами анализа полученных результатов, выжать «по максимуму» уже в максимальном разгоне, слегка подкорректировав дельту и применив прочие «тра-ля-ля» для увеличения результатов.
Начнем рассматривать результаты и пытаться их анализировать в хронологическом порядке (статья писалась по ходу дела: вечером — бенчи, утром – статья… Все по канонам классической литературы).

Наилучшей комбинацией, в которой эффективность конвейеров достигает своего пика, является комбинация 5 квадов процессоров пикселей с 6 процессорами вершин, хотя, учитывая погрешность, эффективными являются все комбинации диапазона 7-5 vpu. GT1, по видимому, зависит, в основном, от производительности пиксельных процессоров, чего не скажешь о GT2 и GT3 – там картина более сложная. И начиная с 2 vpu падение производительности только лишь чуть не дотягивает до теоретических значений потери производительности блока процессоров вершин. Производительность в тесте “Pixel shader” начинает заметно снижаться уже при использовании 3 vpu.

Заметно возросла общая эффективность конвейеров – примерно на 13-15%. Видимо, сказывается меньшая нагрузка на блоки ROP и пропускную способность памяти. Теперь падение производительности, которое бы кореллировало с теорией, происходит только в случае с одним используемым vpu. Начинает проявляться тенденция к тому, что на n квадов требуется большее n количество vpu для максимально эффективной работы GPU. Тенденция к тому, что GT2 наиболее зависим от скорости вершинных процессоров, проявляется все яснее. Производительность пиксельных конвейеров в тесте “Pixel shader” закономерно снизилась (за исключением комбинации 16pp:1vp, где случилась дополнительная просадка в 10% по сравнению с использованием 2 vpu), но цифры тестов вертексных шейдеров, в принципе, те же, что и в случае с 5 квадами.

В этом режиме, практически, на 16 блоков ROP приходится всего 12 пиксельных процессоров, что позволяет с уверенностью говорить о достижении избыточности этих блоков для подобной конфигурации. В остальном, полученная картина становится похожа на таковую в случае с 4 процессорами квадов. Разве что, наиболее эффективным является наличие 5 vpu для загрузки 12 ppu. Цифры теоретических тестов вершинных шейдеров вновь повторяются – видимо, тест заточен именно под vpu. А в случае с тестом “Pixel shader” количество vpu все же оказывает влияние.

Переломным моментом, когда скорость падения итогового балла возрастает, можно назвать переход на использование 3 процессоров вершин. Т.е., оптимальным вариантом для 3Dmark05, в случае восьми активных пиксельных процессоров, является присутствие 4 vpu. Или, используя «мой подход», можно сказать, что четыре процессора вершин могут в полной мере загрузить работой 2 пиксельных квада. Налицо сильная зависимость GT2 и GT3 от вершинников, в то время, как катастрофический удар по GT1 наносит переход с двух на один vpu – видимо, один vpu никак не может считаться достаточным для работы сразу двух процессоров квадов даже в относительно зависящем от производительности пиксельных конвейеров тесте.
В «теории» мы видим отсутствие значительного влияния наличия/отсутствия вершинников на работу пиксельных процессоров. Производительность vpu, в случае использования сложных вершинных шейдеров, гораздо лучше кореллирует с теорией.

Как видно, заметное падение эффективности происходит при переходе от 5 vpu к 6. Думается, в случае 7900GTX, у которой наличествуют 8 вершинников, эффективность работы каждого вершинника будет еще ниже.

Выводы
Делая резюме, хочется отметить, что приведенные цифры эффективности работы конвейеров действительны только для бенчмарка Futuremark 3DMark05 и только для ядра G70/G71. Вкратце же, итоги можно перечислить по пунктам:
1. Даже в рамках одного бенчмарка, требования к соотношению процессоров вершин/пикселей могут разительно различаться. Так, если GT1 требует соотношения qpp:vpu как 1:1,5 (цифра-ориентир, не более того – я не претендую на ее математическую обоснованность), то GT2/GT3 требуют как минимум 2-3 vpu на каждый квад.
2. Второе умозаключение автоматически следует из первого – переход на унифицированную архитектуру оправдан. Динамическое изменение баланса «виртуальных» vpu/ppu/gpu позволяет максимально эффективно использовать имеющиеся ресурсы графического процессора.
3. В рамках неунифицированных архитектур наращивание количества исполнительных блоков с целью повышения производительности неэффективно, без изменения подхода к нагрузке этих блоков. В моем случае, мне кажется очевидным, что наращивание количества тех же vpu в конечном итоге приведет к отсутствию прироста производительности из-за нарастающего падения эффективности каждого отдельного процессора вершин. Возможно, именно поэтому ATI внедрила в GPU поколения R5xx специальный блок Ultra Threaded Dispatcher, отвечавший за повышение эффективности использования вычислительных мощностей.
4. Эффективным способом повышения эффективности работы шейдерных процессоров является повышение рабочих частот графического чипа. Может быть, именно поэтому nVidia в поколении G80 пошла на раздельное тактование различных блоков GPU (тут я хотел бы подчеркнуть, что и раньше, со времен G70, практиковалось разделение частот для блока геометрии и прочего, но, в случае с G80, мне видится подход «по взрослому»).
5. Слабый графический процессор (a-la 4ppu:1vpu) в окружении 256bit шины памяти и 16 блоков ROP так же смешон, как R600 со 128bit шиной, пускай такая память и позволяет раскрыть весь потенциал чипа.

Читайте также:  Ремонт видеокарт питание процессора

На этом заканчиваю свою статью и, с уважением к Вам, раскланиваюсь)

PS. Архив со скриншотами и валидациями античита можно скачать по этой ссылке. Пароль архива — 1221.

Источник

Что такое шейдеры? Просто о сложном для начинающих

«Что такое шейдеры?» — очень частый вопрос любопытных игроков и начинающих игровых разработчиков. В этой статье доходчиво и понятно об этих страшных шейдерах расскажу.

Двигателем прогресса в сторону фотореалистичности картинки в компьютерной графике я считаю именно компьютерные игры, поэтому давайте именно в разрезе видео-игр и поговорим о том, что такое «шейдеры».

До того, как появились первые графические ускорители, всю работу по отрисовке кадров видеоигры выполнял бедняга центральный процессор.

Отрисовка кадра, довольно рутинная работа на самом деле: нужно взять «геометрию» — полигональные модели (мир, персонаж, оружие и т.д.) и растеризовать. Что такое растеризовать? Вся 3d модель состоит из мельчайших треугольников, которые растеризатор превращает в пиксели (то есть «растеризовать» значит превратить в пиксели). После растеризации взять текстурные данные, параметры освещенности, тумана и тп и рассчитать каждый результирующий пиксель игрового кадра, который будет выведен на экран игроку.

Так вот, центральный процессор (CPU — Central Processing Unit) слишком умный парень, чтобы заставлять его заниматься такой рутиной. Вместо этого логично выделить какой-то аппаратный модуль, который разгрузит CPU, чтобы тот смог заниматься более важным интеллектуальным трудом.

Таким аппаратным модулем стал — графический ускоритель или видеокарта (GPU — Graphics Processing Unit). Теперь CPU подготавливает данные и загружает рутинной работой коллегу. Учитывая, что GPU сейчас это не просто один коллега, это толпа миньонов-ядер, то он с такой работой справляется на раз.

Но мы пока не получили ответа на главный вопрос: Что такое шейдеры? Подождите, я подвожу к этому.

Хорошая, интересная и близкая к фото-реализму графика, требовала от разработчиков видеокарт реализовывать многие алгоритмы на аппаратном уровне. Тени, свет, блики и так далее. Такой подход — с реализацией алгоритмов аппаратно называется «Фиксированный пайплайн или конвейер» и там где требуется качественная графика он теперь не встречается. Его место занял «Программируемый пайплайн».

Запросы игроков «давайте, завозите хороший графоний! удивляйте!», толкали разработчиков игр (и производителей видеокарт соответственно) все к более и более сложным алгоритмам. Пока в какой-то момент зашитых аппаратных алгоритмов им стало слишком мало.

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

И вот, наконец, мы дошли до ответа на наш главный вопрос.

«Что такое шейдеры?»

Ше́йдер (англ. shader — затеняющая программа) — это программа для видеокарточки, которая используется в трёхмерной графике для определения окончательных параметров объекта или изображения, может включать в себя описание поглощения и рассеяния света, наложения текстуры, отражения и преломление, затенение, смещение поверхности и множество других параметров.

Что такое шейдеры? Например, вот такой эффект можно получить, это шейдер воды примененный к сфере.

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

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

Читайте также:  Можно ли самому установить видеокарту на ноутбук

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

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

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

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

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

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

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

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

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

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

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

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

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

Изначально шейдеры можно было писать на assembler-like языке, но позже появились шейдерные языки высокого уровня, похожие на язык С, такие как: Cg, GLSL и HLSL.

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

RenderMan

Все что мы обсудили выше относится к realtime графике. Но существуют non-realtime графика. В чем разница — realtime — реальное время, тоесть здесь и сейчас — давать 60 кадров в секунду в игре, это процесс реального времени. А вот рендерить комплексный кадр для ультрасовременной анимации по несколько минут это non-realtime. Суть во времени.

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

Супер-реалистичная графика в Sand piper

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

*Видео могут забанить на Youtube, если оно не открывается, погуглите pixar sandpiper — короткометражный мультфильм про храброго песочника очень милый и пушистый. Умилит и продемонстрирует насколько крутой может быть компьютерная графика.

Так вот это RenderMan от фирмы Pixar. Он стал первым языком программирования шейдеров. API RenderMan является фактическим стандартом для профессионального рендеринга, используется во всех работах студии Pixar и не только их.

Полезная информация

Теперь Вы знаете что такое шейдеры, но помимо шейдеров, есть другие очень интересные темы в разработке игр и компьютерной графике, которые наверняка Вас заинтересуют:

  • Партиклы (системы частиц),- техника создания потрясающих эффектов в современных видео-играх. Обзорная статья и видео с уроками создания эффектов в Unity3d
  • Для начинающего Unity3d программиста,- если Вы задумываетесь о разработке видеоигр, в качестве профессиональной карьеры или хобби, эта статья содержит отличный набор рекомендаций «с чего начать», «какие книги читать» и т.д.

Если остались вопросы

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

Источник