ЗНАЙ ИНТУИТ, Лекция, Визуализация на примитиви
2.3. Въведение в HLSL
В този раздел ще представим High Level Shader Language или накратко HLSL. HLSL се използва за програмиране на върховите и пикселните процесори на графичния ускорител. Програмата за върхов процесор се нарича вертекс шейдър, а за пикселен процесор се нарича пиксел шейдър. Поддръжката на шейдър се появи за първи път в DirectX 8. Вярно, DirectX 8 шейдърите имаха много ограничения и бяха програмирани на език, подобен на сглобяване, но в 9-тата версия на DirectX възможностите на шейдърите се увеличиха значително, което доведе до необходимостта от езици на високо ниво. Създадени са няколко езика на високо ниво за писане на шейдъри DirectX 5 Например, NVIDIA Cg, но де факто езикът се е превърнал в HLSL език, който е част от DirectX 9. В XNA Framework шейдърите също са написани на HLSL, а самата XNA Framework, когато работи с шейдъри на платформата на Windows, разчита до голяма степен на DirectX функционалността .
Тъй като HLSL е тясно свързан с архитектурата на GPU, ще започнем този раздел, като разгледаме основите на съвременната архитектура на GPU.
2.3.1. Графичен конвейер
В раздел 2.2 имате въведение в изобразяването на примитиви с XNA Framework. В същото време действителният процес на изобразяване на изображения (методът GraphicsDevice.DrawUserPrimitive) оставаше черната кутия за нас. Време е да наваксате. Така че, когато се извика методът GraphicsDevice.DrawUserPrimitive, върховете от графичния буфер се изпращат към графичния конвейер XNA Framework за обработка, което представлява последователност от стъпки (прости операции), изпълнени върху върховете в определен ред (Фигура 2.2) . Нека разгледаме тези стъпки по реда на изпълнение:

-
В началото върховете се обработват от върховия процесор с помощта на програма, наречена вертекс шейдър. Изходът от процесора на върховете е така наречените трансформирани (трансформирани) върхове. Към върховете могат да се „прикачат“ различни параметри: цвят на върха, координати на текстурата 6 Координатите на текстурата ще бъдат обсъдени в раздел 5.x. и т.н. Координатите на преобразуваните върхове се задават в логическата система хомогенни координати, наречен клип пространство. Хомогенните координати на върха се определят от четири числа: (x, y, z, w). Преобразуването на хомогенни координати в обикновени геометрични се извършва чрез разделяне на първите три компонента на четвъртия компонент w: (x/w, y/w, z/w. Например връх с хомогенни координати (1, 2, 3, 4) в триизмерно пространство съответства на точка с координати (1/4, 2/4, 3/4) = (0,25,0,5,0,75) Използването на четвъртия компонент се дължи на редица характеристики на алгоритми за изобразяване на триизмерни изображения, използвани в 3D графика. При изобразяване на двуизмерни изображения, w компонентът обикновено се приема за 1. В този случай долният ляв ъгъл на клиентската област на формуляра съответства на точката с координати (-1, -1, 0, 1), горния десен ъгъл на клиентската зона - (1, 1, 0, 1) и центъра на клиентската област - съответно (0, 0, 0, 1 ).
DirectX позволява на програмиста да задава координатите на върховете в координатите на прозореца. В този случай, когато е извикан методът Device.DrawUserPrimitive, върховете незабавно преминават към третия етап на графичния конвейер, заобикаляйки първия и втория етап. Управляваните DirectX и XNA Framework Beta 1 ви позволяват да задавате координати в прозоречна координатна система, но от XNA Framework Beta 2 тази функционалност по някакъв начин е изчезнала. Очевидно това се дължи на желанието да направим XNA Framework възможно най-независим от платформата.
Следващата стъпка е обработката на пикселите от пикселния процесор с помощта на програма, наречена пикселен шейдър. Входът към пикселния процесор са параметрите на пикселите (цвят, координати на текстурата и т.н.), получени чрез интерполиране на съответните параметри на върха по примитивната повърхност. След обработка на входните параметри, пикселният процесор връща цвета на пиксела.
След като прочетете този раздел, може да имате малко объркано разбиране за графичния конвейер. Всичко е наред - в следващия раздел ще се запознаете с езика HLSL и ще напишете няколко шейдъра, след което всичко ще си дойде на мястото.
Всички съвременни графични подсистеми са изградени на принципа на конвейер. Идеята на тръбопровода, пионер на Хенри Форд, е следната: ако сложен процес се раздели на последователност от прости операции (тръбопровод), тогава на изхода на тръбопровода получаваме производителност, равна на производителността от най-бавната операция в тази верига. Като пример за тръбопровод, помислете за производствения процес на популярните процесори AMD Athlon. Изграждането на един процесор отнема около два месеца. Съответно, при класическата организация на производствения процес, едно подразделение може да произвежда около шест процесора годишно. В съвременните фабрики на AMD обаче производственият процес е разделен на 400 етапа. По време на производствения процес всеки бъдещ процесор преминава през всички тези 400 етапа. Веднага след като процесорът премине текущия етап на производство, следващият заема неговото място. В резултат на това до 400 процесора могат да бъдат едновременно на различни етапи от производството. В резултат на това продукцията на тръбопровода е около 400 процесора на два месеца или 2400 процесора годишно. С други думи, производителността на труда нараства с около 400 пъти.