Кіріспе
Графикалық өңдеу блогындағы (GPU) бағдарламаның түрі. Компьютерлік графикада шейдер — 3D көріністі көрсету кезінде жарық, қараңғылық және түстің қажетті деңгейлерін есептейтін компьютерлік бағдарлама. Шейдерлер компьютерлік графиканың арнайы эффектілері мен бейнелерді өңдеуден кейінгі жұмыстарда, сондай-ақ графикалық өңдеу блогындағы (GPU) жалпы мақсаттағы есептеулер үшін әр түрлі мамандандырылған функцияларды орындауға дамыды. Дәстүрлі шейдерлер графикалық аппараттарда рендеринг эффектілерін жоғары дәрежедегі икемділікпен есептейді. Көптеген шейдерлер графикалық өңдеу блогы (GPU) үшін кодталады (және онда жұмыс істейді), бірақ бұл міндетті талап емес. ГПУ-ның рендерингтік құбыржолын бағдарламалау үшін көлеңкелеу тілдері қолданылады, ол бұрынғы тұрақты функциялық құбыржолды, геометрияны түрлендіру және пиксел көлеңкелеу функцияларын ғана рұқсат ететін, толығымен алмастырды; шейдерлердің көмегімен жекелендірілген эффектілерді пайдалануға болады. Соңғы рендерингтелген кескінді құру үшін қолданылатын барлық пиксельдердің, төбелердің және/немесе текстуралардың орны мен түсі (түсі, қанығу, жарықтығы және контрасты) шейдерде анықталған алгоритмдер арқылы өзгертілуі мүмкін, сондай-ақ шейдерді шақыратын компьютерлік бағдарлама енгізген сыртқы айнымалылар немесе текстуралар арқылы да өзгертілуі мүмкін. Шейдерлер кинодағы пост-өңдеуде, компьютерлік графикада және бейне ойындарда әртүрлі эффектілер жасау үшін кеңінен қолданылады. Жасыраудың қарапайым модельдерінен басқа, шейдерлердің күрделі қолданылуларына мыналар жатады: кескіннің реңін, қанығуын, жарықтығын (HSL/HSV) немесе контрасты өзгерту; бұлыңғырлық, жарық гүлдену, көлемдік жарықтандыру, нормальды карталау (тереңдік эффектілері үшін), боке, цел-шейдинг, плакаттау, дөңгелек карталау, бұрмалау, хрома кей (сонымен қатар «көк экран/жасыл экран» эффектілері деп те аталады), жиектерді және қозғалысты анықтау, сондай-ақ демосценада көрінетін психоделикалық эффектілер.
In computer graphics, a shader is a computer program that calculates the appropriate levels of light, darkness, and color during the rendering of a 3D scene—a process known as shading. Shaders have evolved to perform a variety of specialized functions in computer graphics special effects and video post processing, as well as general purpose computing on graphics processing units. Traditional shaders calculate rendering effects on graphics hardware with a high degree of flexibility. Most shaders are coded for (and run on) a graphics processing unit (GPU), though this is not a strict requirement. Shading languages are used to program the GPU's rendering pipeline, which has mostly superseded the fixed function pipeline of the past that only allowed for common geometry transforming and pixel shading functions; with shaders, customized effects can be used. The position and color (hue, saturation, brightness, and contrast) of all pixels, vertices, and/or textures used to construct a final rendered image can be altered using algorithms defined in a shader, and can be modified by external variables or textures introduced by the computer program calling the shader. Shaders are used widely in cinema post processing, computer generated imagery, and video games to produce a range of effects. Beyond simple lighting models, more complex uses of shaders include: altering the hue, saturation, brightness (HSL/HSV) or contrast of an image; producing blur, light bloom, volumetric lighting, normal mapping (for depth effects), bokeh, cel shading, posterization, bump mapping, distortion, chroma keying (for so called "bluescreen/greenscreen" effects), edge and motion detection, as well as psychedelic effects such as those seen in the demoscene.
Тарих
"Шейдер" терминін Pixar компаниясы 1988 жылдың мамыр айында жариялаған RenderMan Interface Specification 3.0 нұсқасымен көпке таныстырды. Графикалық процессорлар дамыған сайын, OpenGL және Direct3D сияқты негізгі графикалық бағдарламалық кітапханалар шейдерлерді қолдауға кірісті. Алғашқы шейдерлерді қолдайтын GPU тек пикселдік шейдерлеуді ғана қолдады, бірақ әзірлеушілер шейдерлердің мүмкіндігін түсінгеннен кейін vertex шейдерлері тез арада енгізілді. Бағдарламаланатын пикселдік шейдері бар алғашқы бейнекарта 2001 жылы шыққан Nvidia GeForce 3 (NV20) болды. Direct3D 10 және OpenGL 3.2 нұсқаларымен геометриялық шейдерлер пайда болды. Соңында графикалық аппараттар бірыңғай шейдерлік модельге қарай дамыды.
Түрлері
Жалпы қолданыста үш түрлі шейдер бар (пиксельдік, төбелік және геометриялық шейдерлер), сондай-ақ жақында бірнеше түрлері қосылды. Ескі графикалық карталар әрбір шейдер түрі үшін жеке өңдеу бірліктерін пайдаланса, жаңа карталар кез келген шейдерді орындауға қабілетті біріктірілген шейдерлерге ие. Бұл графикалық карталарға өңдеу қуатын тиімдірек пайдалануға мүмкіндік береді.
2D шейдерлер
2D шейдерлер сандық кескіндерге әсер етеді, компьютерлік графика саласында олар текстуралар деп те аталады. Олар пикселдердің қасиеттерін өзгертеді. 2D шейдерлер 3D геометрияны көрсету процесіне қатысуы мүмкін. Қазіргі таңдағыда 2D шейдерлердің жалғыз түрі – пиксельдік шейдер.
Пикселдік шедерлер
Пиксельдік шейдерлер, фрагменттік шейдерлер деп те аталады, әрбір "фрагменттің" түсін және басқа да атрибуттарын есептейді: бір шығыс пикселіне ғана әсер ететін рендерлеу жұмысының бірлігі. Пиксельдік шейдерлердің ең қарапайым түрлері бір экран пикселін түс мәні ретінде шығарады; бірнеше кіріс/шығыстары бар күрделі шейдерлер де мүмкін. Пиксельдік шейдерлер әрқашан бірдей түсті шығарудан бастап, жарықтандыру мәнін қолдануға, соққы картасын жасауға, көлеңкелерді, жылтыр жарықтарды, мөлдірлікті және басқа да құбылыстарды іске асыруға қабілетті. Олар фрагменттің тереңдігін өзгерте алады (Z-буферлеу үшін) немесе егер бірнеше рендерлеу нысандары белсенді болса, бірнеше түсті шығарады. 3D графикада пиксельдік шейдер ғана кейбір күрделі эффектілерді шығара алмайды, өйткені ол тек бір фрагментпен жұмыс істейді және сахнаның геометриясы (яғни, төбелік деректері) туралы білмейді. Дегенмен, пиксельдік шейдерлер сызылатын экран координаталарын біледі және егер бүкіл экранның мазмұны шейдерге текстура ретінде берілсе, экранды және жақын орналасқан пиксельдерді үлгілей алады. Бұл техника екі өлшемді пост-өңдеу эффектілерін, мысалы, бұлдырлауды немесе мультяшный/клеткалық шейдерлер үшін жиекті анықтау/жақсартуды іске асыруға мүмкіндік береді. Пиксельдік шейдерлер конвейердегі кез келген екі өлшемді суреттерге (спрайт немесе текстура) аралық кезеңдерде де қолданылуы мүмкін, ал төбелік шейдерлер әрқашан 3D сахнаны қажет етеді. Мысалы, пиксельдік шейдер – видео ағыны растрленгеннен кейін постпроцессор немесе сүзгі ретінде жұмыс істейтін жалғыз шейдер түрі.
3D шейдерлер
3D шейдерлер 3D модельдерге немесе басқа геометрияға әсер етеді, сонымен қатар модельді немесе торды салу үшін қолданылатын түстер мен текстураларды пайдалана алады. Vertex шейдерлері – 3D шейдерлерінің ең көне түрі, олар әдетте әрбір төбе бойынша өзгерістер жасайды. Жаңа геометриялық шейдерлер шейдер ішінде жаңа төбелерді жасай алады. Тесселяциялық шейдерлер – ең жаңа 3D шейдерлері; олар төбелердің жиынтығына бірден әрекет етеді, мысалы, модельді іске қосу кезінде үшбұрыштардың немесе басқа да қарапайым фигуралардың кіші топтарына бөліп, қисықтар мен өркештер сияқты элементтерді жақсартуға немесе басқа да қасиеттерін өзгертуге мүмкіндік береді.
Vertex шаңдауыш
Vertex шейдерлері – 3D шейдерлердің ең көп тараған және қолданылатын түрі. Олар графикалық процессорға жіберілген әрбір төбе үшін бір рет іске қосылады. Оның мақсаты – әрбір төбенің виртуалды кеңістіктегі 3D орнын экрандағы 2D координатасына (сондай-ақ Z буфері үшін тереңдік мәніне) түрлендіру. Vertex шейдерлері орналасу, түс және текстура координаталары сияқты қасиеттерді өзгерте алады, бірақ жаңа төбелерді құра алмайды. Vertex шейдерінің нәтижесі құбырдың келесі сатысына жіберіледі, ол геометриялық шейдер болса, немесе растрлеуші болады. Vertex шейдерлері 3D модельдері бар кез келген сахнадағы орналасу, қозғалыс, жарықтандыру және түстердің егжей-тегжейін бақылауға мүмкіндік береді.
Геометриялық шаңдауыштар
Геометриялық шейдерлер Direct3D 10 және OpenGL 3.2-де пайда болды; бұрын OpenGL 2.0+ нұсқаларында кеңейтімдер арқылы қолжетімді болған. Бұл типтегі шейдер графикалық құбырдың басына жіберілген примитивтерден нүктелер, сызықтар және үшбұрыштар сияқты жаңа графикалық примитивтерді жасай алады. Геометриялық шейдер бағдарламалары vertex шейдерлерден кейін орындалады. Олар кіріс ретінде толық примитивті, мүмкін, жанасу туралы ақпаратты қабылдайды. Мысалы, үшбұрыштармен жұмыс істегенде үш төбе геометриялық шейдердің кірісі болып табылады. Шейдер нөл немесе одан көп примитивтерді шығара алады, олар растрленеді және олардың фрагменттері соңында пиксельдік шейдерге жіберіледі. Геометриялық шейдерлерді қолданудың кең таралған мысалдары: нүктелік сприттерді жасау, геометриялық тесселяция, көлеңке көлемін сығу және текше картаға бір рет рендерлеу. Геометриялық шейдерлердің артықшылықтарын көрсететін нақты мысал – автоматты түрде геометрияның күрделілігін өзгерту. Қисық сызықтың бақылау нүктелерін көрсететін сызық сегменттері геометриялық шейдерге жіберіледі және қажетті күрделілікке байланысты шейдер автоматты түрде қосымша сызықтарды жасайды, олардың әрқайсысы қисықтың жақсырақ жуықтауын қамтамасыз етеді.
Тесселлациялық шатырлаушылар
OpenGL 4.0 және Direct3D 11 нұсқаларынан бастап, тесселяциялық шейдер деп аталатын жаңа шейдер класы енгізілді. Ол дәстүрлі модельге екі жаңа кезеңді қосады: тесселяцияны басқару шейдерлері (корпус шейдерлері деп те аталады) және тесселяцияны бағалау шейдерлері (домен шейдерлері деп те аталады), олар бірлесіп қарапайым торларды математикалық функцияға сәйкес жұмыс істеу кезінде ұсақ торларға бөлуге мүмкіндік береді. Функция әртүрлі айнымалыларға байланысты болуы мүмкін, ең бастысы – көру камерасынан қашықтық, бұл белсенді деңгейдегі егжей-тегжейлі масштабтауға мүмкіндік береді. Бұл камераға жақын заттарға жоғары деңгейдегі бөлшектерді беруге, ал алыс заттарға одан да ірі торларды пайдалануға мүмкіндік береді, бірақ олардың сапасы салыстырмалы болып көрінеді. Сондай-ақ, бұл өте күрделі торларды жадтан алудың орнына шейдерлік бөлімдерде бір рет өңдеуге мүмкіндік беру арқылы қажетті тор өткізу енін күрт азайтуға мүмкіндік береді. Кейбір алгоритмдер кез келген торды ұлғайта алады, ал басқалары торлардағы ең маңызды төбелер мен қабырғаларды көрсету үшін "ұсыныстарды" пайдалануға мүмкіндік береді.
Бастапқы және торлы шатырлар
2017 жылы AMD Vega микроархитектурасы геометрияны өңдеуге қажетті деректерге қол жеткізе алатын, есептеу шейдерлеріне ұқсас жаңа шейдер сатысын қосты. Nvidia 2018 жылы өзінің Turing микроархитектурасымен тор және тапсырма шейдерлерін ұсынды, олар да есептеу шейдерлерінің үлгісімен жасалған. Nvidia Turing – DirectX 12 Ultimate API арқылы тор көлеңкесін қолдайтын әлемдегі алғашқы GPU микроархитектурасы, Ampere RTX 30 сериясы шығармас бұрын бірнеше айға дейін. 2020 жылы AMD және Nvidia RDNA 2 және Ampere микроархитектураларын шығарды, олардың екеуі де DirectX 12 Ultimate арқылы тор көлеңкесін қолдайды. Бұл тор шейдерлер GPU-ға күрделі алгоритмдерді өңдеуге мүмкіндік береді, CPU-дан GPU-ға жұмыс жүктемесін көшіреді және алгоритмге көп көмек қажетті рендеринг кезінде кадр жылдамдығын немесе сахнадағы үшбұрыштар санын бірнеше есе арттырады. Intel компаниясы 2022 жылдың бірінші тоқсанында нарыққа шығатын Intel Arc Alchemist GPU-лары тор шейдерлерін қолдайтынын хабарлады.
Жарық ізін салу шатырлары
Жарық шоғын қадау шейдерлері Microsoft DirectX Raytracing, Khronos Group Vulkan, GLSL және SPIR V, ал Apple Metal арқылы қолдалады.
Есептеу шедерлері
Есептеу шейдерлері графикалық қолданбалармен ғана шектелмейді, бірақ GPGPU үшін ортақ орындау ресурстарын пайдаланады. Оларды графикалық құбырларда, мысалы, анимация немесе жарықтандыру алгоритмдерінің қосымша кезеңдерінде (мысалы, плиткалық алға рендерингте) қолдануға болады. Кейбір рендеринг API есептеу шейдерлеріне графикалық құбырмен дерек ресурстарын оңай бөлісуге мүмкіндік береді.
Параллель өңдеу
Шейдерлер элементтердің үлкен жиынтығына бірден трансформацияларды қолдану үшін жазылады, мысалы, экранның бір аймағындағы әрбір пикселіне немесе модельдің әрбір төбесіне. Бұл параллель өңдеуге өте ыңғайлы, және қазіргі заманғы GPU-лардың көптеген шейдерлік конвейерлері бар, бұл есептеулердің өнімділігін күрт арттырады. Шейдерлерді қолданатын бағдарламалау моделі рендеринг үшін жоғары деңгейлі функцияға ұқсас: шейдерлер аргументтер ретінде беріледі және аралық нәтижелер арасындағы нақты дерек ағынын қамтамасыз етеді, соның арқасында деректерді параллель өңдеу (пиксельдер, төбелер және т.б. бойынша) және конвейерлік параллелизм (кезеңдер арасында) мүмкін болады. (сонымен қатар, map reduce-ды қараңыз).
Бағдарламалау
Шейдерлер бағдарламаланған тіл нысаналық ортаға байланысты. OpenGL және OpenGL ES ресми көлеңкелеу тілі – OpenGL Shading Language, сондай-ақ GLSL деп те аталады, ал ресми Direct3D көлеңкелеу тілі – High Level Shader Language, немесе HLSL. OpenGL және Direct3D шейдерлерін шығаратын үшінші тараптың көлеңкелеу тілі Cg Nvidia компаниясымен әзірленген; алайда 2012 жылдан бері ол қолданыстан шығарылды. Apple компаниясы Metal фреймворкінің бір бөлігі ретінде Metal Shading Language деп аталатын өзінің көлеңкелеу тілін жариялады.
GUI шадер редакторлары
Қазіргі заманғы Unity, Unreal Engine және Godot сияқты видео ойын әзірлеу платформалары нақты код қажеттілігінсіз шейдерлерді жасауға мүмкіндік беретін түйінге негізделген редакторларды жиі қамтиды; пайдаланушыға әртүрлі текстураларды, карталарды және математикалық функцияларды диффузиялық түс, жылтыр түс және қарқындылығы, дөрекілік/металдық сипаттамасы, биіктік, нормаль және т.б. сияқты шығыс мәндеріне бағыттауға мүмкіндік беретін байланысқан түйіндердің бағытталған графигі ұсынылады. Автоматты компиляция графикті нақты, компиляцияланған шейдерге түрлендіреді.