HLSL GLSL CG ēnojuma valodas salīdzinājums

Hlsl Glsl Cg Shading Language Comparison



Dalieties ar mana skolotāja, Dievs, mākslīgā intelekta apmācību! Nulles pamats, viegli saprotams! http://blog.csdn.net/jiangjunshow

Laipni lūdzam arī atkārtoti izdrukāt šo rakstu. Daloties zināšanās, dodot labumu cilvēkiem un apzinoties mūsu ķīniešu tautas lielo atjaunošanos!



Izraksts “GPU programmēšana un Cg valodas pamatprogramma, 1. izdevums” Ķīniešu nosaukums ”GPU programmēšana un CG valodas Yangchun baltais sniegs zem Libas iedzīvotājiem”



Pēdējā gada laikā man nekad nav nācies rakstīt nevienu HLSL / GLSL ēnotāju. Apakšējā līnija: es nevaru iedomāties nevienu iemeslu, kāpēc NELIETOT CG.



Shader valoda, ko sauc par ēnojuma valodu, ēna angļu valodā ir ēnas, krāsu toņa nozīme, Vikipēdija ēnotāja valodā tiek skaidrota šādi: 'Virsmas ēnošanas procedūras uzdevums ir izvēlēties krāsu katram virsmas pikseļam, iekļaujot tajā visas variācijas Pašas virsmas krāsā un gaismā, kas spīd uz virsmas (Marc Olano), tas ir, ēnotāja valoda aprēķina katra pikseļa krāsu vērtību, pamatojoties uz objekta īpašībām un apgaismojuma apstākļiem.

Faktiski šai interpretācijai ir acīmredzami laika ierobežojumi. Agrīnā GPU programmēšanas izstrādē ēnotājas valodas mērķis bija pastiprināt grafikas apstrādes algoritma kontroli, tāpēc uz to ir vērsta arī valodas definīcija. Bet, attīstoties tehnoloģijai, pašreizējā ēnotāja valoda jau sen tiek izmantota vispārējos skaitļošanas pētījumos.

Ēnotāja valoda tiek pozicionēta kā augsta līmeņa valoda. Piemēram, GLSL pilns nosaukums ir “High Level Shading Language”, pilns Cg valodas nosaukums ir “C for Graphic”, un šo divu ēnotāju valodu sintakses noformējums ir ļoti līdzīgs C valodai. Tomēr svarīga augsta līmeņa valodu iezīme ir “neatkarīga no aparatūras”. Šajā ziņā ēnotāja valoda joprojām nav pieejama. Shader valoda pilnībā paļaujas uz GPU arhitektūru. Šī funkcija šajā posmā ir ļoti acīmredzama! Jebkura veida ēnotājai jābūt balstītai uz grafikas aparatūru, tāpēc GPU programmēšanas tehnoloģijas attīstība būtībā ir grafikas aparatūras izstrāde. Pirms ēnotāja valodas pastāvēšanas spēja demonstrēt uz grafiku balstītu aparatūras programmēšanu balstījās uz zema līmeņa montāžas valodu.



Šobrīd ēnotāja valodas attīstības virziens ir tāda augsta līmeņa valodas izstrāde, kuru ērtības ziņā var salīdzināt ar C ++ / JAVA, “dodot programmētājiem elastīgu un ērtu programmēšanas metodi” un “kontrolējot renderēšanas procesu iespējams grafika izmantošana, vienlaikus aparatūras paralēlisms uzlabo algoritma efektivitāti. ' Shader valodai pašlaik ir trīs galvenās valodas: OpenGL balstīta GLSL, Direct3D bāzes HLSL un NVIDIA Cg valoda.

Šīs nodaļas mērķis ir izskaidrot ēnotāja valodas pamatprincipus un darbības plūsmu. Pirmkārt, no aparatūras viedokļa programmējamais virsotnes procesors (programmējams virsotnes procesors, kas pazīstams arī kā virsotņu ēnotājs) un programmējams fragmentu procesors (programmējams fragmentu procesors, pazīstams arī kā Paskaidrojiet fragmentu ēnotāja lomu, un pēc tam īpaši apspriediet virsotņu programmu un fragmentu programmu, un visbeidzot salīdziniet GLSL, HLSL un Cg.

3.1 Shader valodas princips

Shader valodā rakstītu programmu sauc par shader programmu. Ēnošanas programmas iedala divās kategorijās: virsotņu ēnotāja programma un fragmentu ēnotāja programma. Lai skaidri izskaidrotu virsotņu ēnojuma un fragmentu ēnojuma nozīmi, vispirms GPU izskaidrojam divus komponentus: programmējamo virsotņu procesoru (pazīstams arī kā virsotņu ēnotājs) un programmējamo fragmentu procesoru (programmējamais fragmentu procesors). , pazīstams arī kā fragments shader). Kā aplūkots literatūras 2.2.4. Sadaļā [2]:

Virsotnes un fragmentu apstrāde sadalīta programmējamās vienībās. Programmējamais virsotnes procesors ir aparatūras vienība, kas vada jūsu Cg Vertex programmas, savukārt programmējamais fragmentu procesors ir vienība, kas vada jūsu Cg fragmentu programmas.

Šīs rindkopas nozīme ir tāda, ka virsotnes un fragmentu procesori ir sadalīti programmējamās vienībās, programmējamais virsotnes procesors ir aparatūras vienība, kas var palaist virsotņu programmas, un programmējamais fragmentu procesors ir vienība, kas var palaist fragmentu programmas.

Gan virsotņu, gan fragmentu procesoriem ir ļoti spēcīgas paralēlas skaitļošanas iespējas, un tie ļoti labi veic matricas (ne augstāku par 4. kārtas) aprēķinus. Fragmentu procesori var arī ātri pieprasīt informāciju par tekstūru (pašreizējie virsotņu procesori vēl nav pieejami, tas ir virsotņu procesors). attīstības virziens).

Kā minēts iepriekš, virsotņu programma darbojas virsotņu procesorā, un fragmentu programma darbojas uz fragmentu procesora, kas precīzi kontrolē to, kurš process tiek parādīts GPU. 8. attēlā parādīts programmējams grafikas atveidošanas cauruļvads.

, HLSL VS GLSL VS CG - - lee_shutong GPU

Salīdziniet iepriekšējās nodaļas 3. attēlu. GPU renderēšanas cauruļvadā var redzēt, ka virsotnes ēnotājs kontrolē virsotnes koordinātu pārveidošanas procesu, bet fragmentu ēnotājs kontrolē pikseļu krāsu aprēķināšanas procesu. Tas nošķir virsotnes ēnotāja un fragmenta ēnotāja sadalījumu: Virsotņu programma ir atbildīga par virsotņu koordinātu transformāciju. Fragmentu programma ir atbildīga par pikseļu krāsu aprēķinu, pirmā izeja ir pēdējā ievade.

9. attēlā parādīta programmējamas grafikas aparatūras ieeja / izeja šajā posmā. Ievades reģistrs saglabā sākotnējo primitīvo informāciju, bet izejas reģistrs glabā apstrādāto primitīvo informāciju, bet tekstūras buferis glabā tekstūras datus. Pašlaik lielākā daļa programmējamo grafisko aparatūru atbalsta tikai fragmentu procesoru, lai apstrādātu faktūru, kuras ārējās resursdatora programmas pastāvīgā ievade tiek ievietota pastāvīgajā reģistrā, pagaidu reģistrā tiek saglabāti pagaidu dati, kurus izpildītāja laikā ģenerē ēnotājs.

, HLSL VS GLSL VS CG - - lee_shutong GPU

3.2 Vertex Shader programma

Vertex shader programmu un Fragment shader programmu izpilda attiecīgi Programmable Vertex Processor un Programmable Fragment Processo.

Virsotnes ēnotājs no GPU priekšgala moduļa (reģistra) iegūst primitīvu informāciju (virsotnes pozīciju, parasto vektoru, faktūras koordinātas utt.) Un veic tādas darbības kā virsotnes koordinātu telpas pārveidošanu, normālu vektora telpas pārveidošanu, apgaismojuma aprēķinu utt. un visbeidzot aprēķina aprēķinātos datus. Pārsūtiet uz norādīto reģistru, tad fragmentu ēnotājs no tā iegūst nepieciešamos datus, parasti 'tekstūras koordinātas, apgaismojuma informāciju utt.' un veic katru fragmentu, pamatojoties uz šo informāciju un tekstūras informāciju (ja tāda ir), kas nodota no lietojumprogrammas. Krāsu aprēķins un visbeidzot apstrādātie dati tiek nosūtīti rastra darbības modulim.

10. attēlā parādīta datu apstrādes plūsma virsotņu un pikseļu ēnotājā. Lietotnē iestatītā primitīvā informācija (virsotnes pozīcijas koordinātas, krāsa, faktūras koordinātas utt.) Tiek nodota virsotnes buferim, bet informācija par tekstūru tiek nodota tekstūras buferim. Punktētā līnija norāda datu pārsūtīšanu, kas vēl nav ieviesta. Pašreizējā virsotņu programma nevar apstrādāt informāciju par tekstūru, un informāciju par tekstūru var nolasīt tikai fragmentu programmā.

Virsotnes ēnotājs un fragmentu ēnotājs parasti pastāv vienlaicīgi, un pirmā izvade tiek izmantota kā pēdējās ievade. Tomēr ir iespējams arī tikai virsotņu ēnotāji. Ja ir tikai virsotnes ēnotājs, tiek manipulētas tikai ar ievades virsotnēm, un punkti virsotnes iekšienē tiek automātiski interpolēti atbilstoši aparatūras noklusējumam. Piemēram, ievadiet trīsstūra plāksteri, virsotņu ēnotāja programma veic Phong apgaismojuma aprēķinu un aprēķina tikai trīs virsotņu apgaismojuma krāsu, un trīsstūra plākstera iekšējo punktu krāsa atbilst aparatūras noklusējuma algoritmam (Gourand ēnojums vai fast phong ēnošana) Interpolācija, ja grafikas aparatūra ir progresīvāka, noklusējuma apstrādes algoritms ir labāks (ātra phong ēnošana), efekts būs labāks, ja grafikas aparatūra izmantos Gourand ēnošanas algoritmu, būs Mach joslas efekts (svītrojums).

Fragmentu krāsošanas programma katram fragmentam veic neatkarīgu krāsu aprēķinu, un pats algoritms tiek uzrakstīts, kam ir ne tikai laba vadāmība, bet arī tiek sasniegti labāki rezultāti.

Tā kā GPU apstrādā datus paralēli, katrs no tiem izpildīs ēnotāja programmu. Tas ir, katrs virsotnes dati izpilda virsotņu programmu, tiklīdz katrs fragments izpilda fragmenta programmu.

, HLSL VS GLSL VS CG - - lee_shutong GPU

3.3 Fragmentu ēnotāja programma

Fragmentu ēnotājs katram klipam veic atsevišķu krāsu aprēķinu, un galīgā izvades krāsas vērtība ir klipa galīgā krāsa. Var teikt, ka virsotnes ēnotājs galvenokārt veic ģeometriskas darbības, un fragmentu ēnotājs galvenokārt aprēķina galīgo krāsas vērtību.

Vēl viena izcila fragmenta ēnotāja iezīme ir tā spēja izgūt faktūras. Attiecībā uz GPU tekstūras ir līdzvērtīgas masīviem, kas nozīmē, ka, ja vēlaties veikt vispārējas nozīmes aprēķinus, piemēram, masīvu šķirošanu, virkņu izgūšanu utt., Jums jāizmanto fragmentu ēnotājs. Ļaujiet virsotņu ēnotājiem arī iegūt tekstūras, kas pašlaik ir pētījumu virziens.

Pielikums: Kas ir gabals? Kāda ir atšķirība starp klipu un pikseļu? Tā sauktais fragments ir visu 3D virsotņu datu kopa pēc rastrēšanas. Dati nav salīdzināti ar dziļuma vērtību, un ekrānā redzamie pikseļi tiek dziļi salīdzināti.

3.4 CG VS GLSL VS HLSL

Shader valodai pašlaik ir trīs galvenās valodas: OpenGL balstīta GLSL (OpenGL ēnošanas valoda, kas pazīstama arī kā GLslang), Direct3D bāzes HLSL (augsta līmeņa aizēnošanas valoda) un NVIDIA Cg (C grafikai) valoda.

GLSL un HLSL attiecīgi piedāvā saskarnes, kuru pamatā ir OpenGL un Direct3D. Abus nevar sajaukt. Patiesībā OpenGL un Direct3D vienmēr ir bijuši pretēji viens otram. Cao Cao un Liu Bei ir salds mierīgas līdzāspastāvēšanas laiks, taču attiecīgie OpenGL un Direct3D īpašnieki nekad nav bijuši. Tā ir cīņa. Pēc ilgas cīņas, tā kā nav uzvaras vai sakāves, tā noteikti būs abu zaudējumu situācija.

Pirmkārt, ATI sērijas grafikas kartes neatbalsta OpenGL paplašinājumus. Piemēram, kad es izmantoju Open Scene Graphic (OSG) atvērtā koda grafikas motoru, jo motora pamatā ir pilnībā OpenGL, uz tā rakstītajam 3D emulatoram bieži ir faktūras uz vecākām grafikas kartēm. Parādītā problēma. Otrkārt, GLSL gramatikas sistēma ir pašpietiekama, un HLSL un Cg valodas sintakse būtībā ir vienāda, kas nozīmē, ka jebkuras HLSL un Cg valodas apguve ir līdzvērtīga divu valodu apguvei. Tomēr galu galā OpenGL, kas ir grafikas API vadītājs, parasti ievieš OpenGL ar “de facto nozares standartu”, tāpēc tā ilgtermiņa attīstībā uzkrāto lietotāju bāze ir milzīga, un šie lietotāji, protams, izvēlēsies GLSL mācīšanos. Turklāt GLSL pārmanto OpenGL labu pārnesamību un kādreiz dominēja tādās operētājsistēmās kā Unix (tas bija pagātnes notikums).

Microsoft HLSL pārnesamība ir slikta, uz Windows platformas var raksturot kā lielu, var iziet no sava pagalma (par laimi, pagalms ir pietiekami liels), tas ir, fēnikss izkraušanai nav tik labs kā vistas gaļa. Tas lielā mērā ir ierobežojis HLSL popularizēšanu un attīstību. Lielākā daļa HLSL pašlaik tiek izmantota spēļu laukā. Es varu būt atbildīgs par apgalvojumu, ka Shader valodas laukā HLSL var paļauties uz Microsoft veco grāmatu, lai kļūtu par separātistu puses princi, taču tas nekad nevar būt pasaules hegemons. Tas ir ļoti līdzīgs Microsoft pašreizējai situācijai. Tas ir liels bagāts cilvēks, kuru ieskauj dzeloņziedi. Tas ir tik bagāts, ka to ir grūti pārvietoties.

Iepriekš minētie divi lielie sitieni ir ļoti entuziastiski. Šajā gadījumā jūs varat izmantot parasto teicienu, lai aprakstītu: 'Es gribu cīnīties, zvejnieki gūst labumu'. NVIDIA tagad ir pelnītās grafikas kartes karalis (it īpaši pēc AMD ATI iegādes), ir GPU programmēšanas teorijas pamatlicējs, GeForce grafisko karšu sērija jau sen ir dziļi iesakņojusies cilvēku sirdīs, tās Cg valoda ir guvusi lielus panākumus , veidoja trīs kāju tendenci. NVIDIA labi pārzina reklāmu. Vispopulārākā GPU programmēšanas grāmata ir no uzņēmuma. Grāmata ne tikai iepazīstina ar daudzām GPU jaunākajām zināšanām, bet pats galvenais, ka lielākā daļa no tām tiek ieviestas Cg valodā. Ar šo grāmatu sēriju NVIDIA ne tikai apstiprināja akadēmisko stāvokli jauno studentu vidū, bet arī veiksmīgi popularizēja Cg valodu. Es pats lietoju Cg valodu pētniecībai un izstrādei šādu iemeslu dēļ:

Pirmkārt, Cg ir grafikas procesora programmēšanas valoda, kuru plaši atbalsta OpenGL un Direct3D. Cg valoda un OpenGL, DirectX nav vienāds valodas līmenis, bet OpenGL un DirectX augšējais slānis, tas ir, Cg programma tiek palaista OpenGL un DirectX standarta virsotnēs un pikseļos

Otrkārt, Cg valoda ir Microsoft un NVIDIA sadarbojas standarta aparatūras apgaismojuma valodas sintaksē un semantikā. Dokumenta [1] nosaukums 1.3.1. Sadaļā ir “Microsoft un NVIDIA sadarbība, lai attīstītu Cg un HLSL”, tāpēc HLSL un Cg faktiski ir viena un tā pati valoda (skatiet apstiprināšanas sadaļu Cg apmācības 29. lappusē _Programmējams reāls Laika grafisko autoru rokasgrāmata). Daudzas reizes jūs atradīsit, ka HLSL rakstīto kodu var izmantot tieši Cg kodā. Citiem vārdiem sakot, cg pamatā ir zināšanu alianse (Microsoft un NVIDIA), un tam ir pārplatformu raksturs. Cg valodas izvēle ir vispārējā tendence. Cienījamie lasītāji, jūs varat pievērst uzmanību pašreizējām tirgū esošajām GPU programmēšanas grāmatām, kas galvenokārt balstītas uz CG valodu. (Pielikums: Microsoft un NVIDIA kopīgi uzsāka Cg, tam vajadzētu būt ekonomiskam un tehniskam ieguvumam, tādējādi kopīgi cīnoties pret GLSL)

Turklāt grafikai Cg, C tiek izmantots grafikas C valodā. Tas faktiski parāda, ka dizaineru sākotnējais nodoms tajā laikā bija 'padarīt aparatūras programmēšanu tikpat ērtu un bezmaksas kā C programmēšana'. Tāpat kā C ++ un Java sintakse ir balstīta uz C, arī pati cg valoda ir balstīta uz C. Ja esat lietojis kādu no C, C ++ un Java, Cg sintaksi ir samērā viegli uztvert. Cg valoda stingri saglabā lielāko daļu C valodas semantikas, mēģinot atbrīvot izstrādātājus no aparatūras detaļām. Cg ir arī augsta līmeņa valodu priekšrocības, piemēram, koda atkārtota izmantošana un lasāmība. Ar cg jūs varat arī īstenot animācijas virzītus, vispārējas nozīmes aprēķinus (šķirošana, atrašana) un daudz ko citu.

Iepriekš ir bijušas baumas: NVIDIA gatavojas atteikties no Cg valodas. Apspriežot Cg, GLSL, HLSL priekšrocības un trūkumus internetā, plaši tiek apšaubīta arī Cg starpplatformitāte. Kad 2007. gada decembrī es piedalījos Zhu Youhong OSG apmācības klasē, viņš bija īpaši salīdzinājis Cg, GLSL un HLSL. Viņš teica: Lai gan joprojām pastāv daži strīdi starp Cg un GLSL, galvenie 3D grafikas ražotāji sāk atbalstīt Cg valodu. Tirgus ekonomikas izvēle var izskaidrot visu, laiks var pateikt patiesību. Līdz 2009. gada beigām Cg valoda nav pamesta, bet arvien populārāka.

Es meklēju diskusiju ziņas par CG un GLSL OGRE oficiālajā forumā un noslēdzu nodaļu ar viena no ziņām beigām:

Pēdējā gada laikā man nekad nav nācies rakstīt nevienu HLSL / GLSL ēnotāju. Apakšējā līnija: es nevaru iedomāties nevienu iemeslu, kāpēc NELIETOT CG.

Zvaniet manas skolotājas mākslīgā intelekta apmācībai! http://blog.csdn.net/jiangjunshow

attēls