Կետային լույսի աղբյուր opengl-ում: Մենք շարունակում ենք OpenGL-ի մեր ուսումնասիրությունը. լուսավորություն ըստ Phong-ի: Այս ամենը միասին դնելով

Լուսավորությունը OpenGL ES-ում օգտակար հատկություն է, որը կարող է հաճելի շունչ հաղորդել 3D խաղերին: Այսպիսի ֆունկցիոնալությունն օգտագործելու համար մենք նախ պետք է հասկանանք OpenGL ES լուսավորության մոդելը:

Ինչպես է աշխատում լուսավորությունը

Եկեք մտածենք, թե ինչպես է աշխատում լուսավորությունը: Նախ մեզ անհրաժեշտ է լույսի աղբյուր, որը լույս է արձակում: Ձեզ նույնպես անհրաժեշտ կլինի լուսավորված առարկա։ Ի վերջո, մեզ անհրաժեշտ է նաև սենսոր, ինչպիսին է աչքը կամ տեսախցիկը, որն ընդունում է լույսի աղբյուրից ուղարկվող և առարկայի կողմից արտացոլված ֆոտոնները: Լուսավորությունը փոխում է օբյեկտի ընկալվող գույնը՝ կախված՝ լույսի աղբյուրի տեսակից. լույսի աղբյուրի գույնը կամ ինտենսիվությունը; լույսի աղբյուրի դիրքը և դրա ուղղությունը լուսավորված օբյեկտի նկատմամբ. օբյեկտի նյութը և հյուսվածքը:

Առարկայի կողմից լույսի արտացոլման ինտենսիվությունը կախված է բազմաթիվ գործոններից։ Ամենակարևոր գործոնը, որը մենք նայում ենք, դա այն անկյունն է, որով լույսի ճառագայթը հարվածում է մակերեսին: Որքան մոտ է այս անկյունը ճիշտ անկյան հետ, այնքան մեծ է լույսի ինտենսիվությունը, որով կարտացոլվի օբյեկտից: Սա պատկերված է Նկ. 11.1.

Երբ լույսի ճառագայթը դիպչում է մակերեսին, այն կարտացոլվի երկու տարբեր ուղղություններով: Լույսի մեծ մասը կարտացոլվի ցրված: Սա նշանակում է, որ արտացոլված լույսի ճառագայթները ցրված են անհավասար և պատահականորեն օբյեկտի մակերեսով: Որոշ ճառագայթներ արտացոլվում են սպեկուլյար կերպով: Սա նշանակում է, որ լույսի ճառագայթները կարտացոլվեն այնպես, կարծես կատարյալ հայելին հարվածեն: Նկ. Նկար 11.2-ը ցույց է տալիս ցրված և սպեկուլյար անդրադարձումների տարբերությունը:

Բրինձ. 11.1. Որքան մոտ է անկյունը ճիշտ անկյունին, այնքան մեծ է արտացոլված լույսի ինտենսիվությունը

Բրինձ. 11.2. Ցրված ու ակնառու մտորումներ

Տեսակետային արտացոլումները կհայտնվեն առարկաների վրա որպես շեշտադրումներ: Արդյոք լույսը ակնառու կերպով արտացոլվում է առարկայից, կախված է այն նյութից, որից այն պատրաստված է: Մաշկի նման անհարթ կամ կոպիտ մակերես ունեցող առարկաները, ամենայն հավանականությամբ, չեն ունենա ակնառու ընդգծումներ: Այն առարկաները, որոնք ունեն հարթ մակերես, ինչպես ապակի կամ մարմար, կցուցադրեն այս թեթև արտեֆակտները: Իհարկե, ապակին կամ մարմարը կատարյալ հարթ չեն, բայց համեմատած փայտի կամ մարդու մաշկի հետ՝ դրանք հարթ են:

Երբ լույսը դիպչում է մակերեսին, նրա արտացոլումը նույնպես փոխում է գույնը՝ կախված նրանից քիմիական բաղադրությունըլուսավորված օբյեկտ. Օբյեկտները, որոնք մեզ կարմիր են թվում, արտացոլում են լույսի միայն կարմիր հատվածները և կլանում մնացած բոլոր հաճախականությունները: Սև առարկան այն է, որը կլանում է իր վրա ընկած գրեթե ամբողջ լույսը:

OpenGL ES-ը թույլ է տալիս մոդելավորել իրական աշխարհի վարքագիծը՝ սահմանելով լույսի աղբյուրները և առարկայական նյութերը:

Լույսի աղբյուրներ

Մենք շրջապատված ենք բազմաթիվ տարբեր լուսավորության աղբյուրներով: Արևն անընդհատ դուրս է ուղարկում իր ֆոտոնները: Մոնիտորները լույս են արձակում, որը գիշերը շրջապատում է մեզ հաճելի փայլով: Լամպերը և լուսարձակները օգնում են մեզ խուսափել մթության մեջ տարբեր առարկաների հետ բախվելուց: OpenGL ES-ը թույլ է տալիս ստեղծել չորս տեսակի լույսի աղբյուրներ:

Հետին լույս. Այն ինքնին լույսի աղբյուր չէ, այլ լույսի այլ աղբյուրներից ֆոտոնների առաջացման արդյունք։ Այս պատահական ֆոտոնները միասին ստեղծում են լուսավորության մշտական ​​մակարդակ, որը չունի ուղղություն և հավասարապես լուսավորում է բոլոր առարկաները:

Կետային լույսի աղբյուրներ. Նրանք տարածության մեջ դիրք ունեն և լույս են արձակում բոլոր ուղղություններով։ Օրինակ, լույսի կետային աղբյուրը լույսի լամպն է:

Ուղղորդված լուսավորության աղբյուրներ. Արտահայտված որպես ուղղություններ OpenGL ES-ում: Ենթադրվում է, որ դրանք անսահման հեռու են: Իդեալում, Արեգակը կարող է նման աղբյուր լինել: Կարելի է ենթադրել, որ Արեգակից եկող բոլոր լուսային ճառագայթները Երկրին դիպչում են նույն անկյան տակ՝ Երկրի և Արեգակի միջև հեռավորության պատճառով։

Լամպերի մասին. Այս լույսերը նման են կետային լույսերին, քանի որ նրանք ունեն որոշակի դիրք տարածության մեջ: Բացի այդ, նրանք ունեն ուղղություն, որով լույսի ճառագայթներ են արձակում։ Նրանք ստեղծում են որոշակի շառավղով սահմանափակված թեթեւ կոն։ Նման լույսի աղբյուրի օրինակ է փողոցային լամպը:

Մենք կքննարկենք միայն հետևի լուսավորությունը, ինչպես նաև կետային և ուղղորդված լույսի աղբյուրները: Լույսերը հաճախ դժվար է օգտագործել GPU-ով սահմանափակ Android սարքերում, քանի որ OpenGL ES-ը հաշվարկում է լուսավորությունը: Շուտով կհասկանաք, թե ինչու է այդպես։

Բացի լույսի աղբյուրի դիրքից և ուղղությունից, OpenGL ES-ը թույլ է տալիս որոշել լույսի գույնը կամ ինտենսիվությունը: Այս բնութագրերն արտահայտվում են RGBA գույնի միջոցով: Այնուամենայնիվ, OpenGL ES-ը պահանջում է, որ դուք յուրաքանչյուր աղբյուրի համար սահմանեք չորս տարբեր գույներ՝ ընդամենը մեկի փոխարեն:

Ընդգծում - ինտենսիվությունը/գույնը, որը նպաստում է օբյեկտի ստվերմանը: Օբյեկտը հավասարապես կլուսավորվի բոլոր կողմերից՝ անկախ լույսի աղբյուրի նկատմամբ իր դիրքից կամ կողմնորոշումից:

Դիֆուզ – լույսի ինտենսիվություն/գույն, որը կլուսավորի առարկան ցրված անդրադարձումը հաշվարկելուց հետո: Օբյեկտի եզրերը, որոնք դեմ չեն լույսի աղբյուրին, չեն լուսավորվի, ինչպես իրական կյանքում։

Տեսակավոր – ինտենսիվություն/գույն, որը նման է ցրված գույնին: Այնուամենայնիվ, դա ազդում է միայն օբյեկտի այն կետերի վրա, որոնք ունեն որոշակի կողմնորոշում լույսի աղբյուրի և սենսորի նկատմամբ:

Emissive-ը շատ բարդ գունային հաշվարկ է, որն ունի չափազանց սահմանափակ կիրառություն իրական աշխարհի ֆիզիկայի ծրագրերում, ուստի մենք չենք լուսաբանի այն:

Ամենից հաճախ մենք կօգտագործենք լույսի աղբյուրի ցրված և տեսողական ինտենսիվությունները և կտանք մյուս երկու լռելյայն արժեքները: Բացի այդ, շատ ժամանակ մենք կօգտագործենք նույն RGBA գույնը և՛ ցրված, և՛ տեսողական ինտենսիվության համար:

Նյութեր

Մեր աշխարհի բոլոր առարկաները բաղկացած են ինչ-որ նյութից: Յուրաքանչյուր նյութ որոշում է, թե ինչպես կարտացոլվի առարկայի վրա ընկած լույսը և կփոխի արտացոլված լույսի գույնը: OpenGL ES-ը թույլ է տալիս նյութի համար սահմանել նույն չորս RGBA գույները, ինչպես լույսի աղբյուրը:

Հետևի լույսը գույն է, որը համակցվում է տեսարանի ցանկացած լույսի աղբյուրի ֆոնի գույնի հետ:

Դիֆուզը գույն է, որը համակցվում է ցանկացած լույսի աղբյուրի ցրված գույնի հետ:

Specular-ը գույն է, որը համակցվում է ցանկացած լույսի աղբյուրի ակնառու գույնի հետ: Այն օգտագործվում է օբյեկտի մակերեսի վրա շեշտադրումներ ստեղծելու համար:

Էմիսիվ - մենք շարունակում ենք անտեսել այս տեսակի գույնը, քանի որ այն գործնականում չի օգտագործվում մեր համատեքստում:

Նկար 11.3-ը ցույց է տալիս նյութի/լույսի աղբյուրի հատկությունների առաջին երեք տեսակները՝ հետին լույս, ցրված և տեսողական:

Բրինձ. 11.3. Տարբեր տեսակի նյութեր/լույսի աղբյուրներ՝ միայն հետին լույս (ձախ), միայն ցրված (միջին), հետևի լույս և ցրված գույն՝ ակնառու ընդգծումներով (աջ)

Նկ. Նկար 11.3-ում ներկայացված է նյութերի և լույսի աղբյուրների տարբեր հատկությունների ազդեցությունը գույնի վրա: Հետևի լույսը հավասարաչափ լուսավորում է չափը: Ցրված լույսը կարտացոլվի՝ կախված այն անկյունից, որով լույսի ճառագայթները դիպչում են օբյեկտին. Այն տարածքները, որոնք ուղղակիորեն նայում են լույսի աղբյուրին, կլուսավորվեն ավելի պայծառ, այն հատվածները, որոնց լույսը չի կարող հասնել՝ մութ: Ճիշտ պատկերում դուք կարող եք տեսնել հետին լույսի, ցրված և տեսողական լույսի համադրություն: Տեսակետային լույսը հայտնվում է որպես սպիտակ ընդգծումներ ոլորտի վրա:

Ինչպես է OpenGL ES-ը հաշվարկում լուսավորությունը՝ գագաթային նորմերը

Դուք գիտեք, որ օբյեկտից արտացոլվող լույսի ինտենսիվությունը կախված է օբյեկտի վրա նրա անկման անկյունից: OpenGL ES-ն օգտագործում է այս փաստը լուսավորությունը հաշվարկելու համար: Դրա համար այն օգտագործում է գագաթային նորմեր, որոնք պետք է սահմանվեն կոդով այնպես, ինչպես հյուսվածքների կոորդինատները կամ գագաթային գույները: Նկ. Նկար 11.4-ը ցույց է տալիս գունդը և նրա գագաթի նորմերը:

Բրինձ. 11.4. Ոլորտը և նրա գագաթային նորմերը

Նորմալները միավոր վեկտորներ են, որոնք ցույց են տալիս մակերեսի պտտման ուղղությունը: Մեր դեպքում մակերեսը եռանկյուն է: Մակերեւույթը նորմալ սահմանելու փոխարեն մենք սահմանում ենք գագաթը նորմալ: Այս նորմերի միջև տարբերությունն այն է, որ գագաթի նորմալը կարող է ցույց չտալ նույն ուղղությամբ, ինչ մակերեսի նորմալը: Սա հստակ տեսանելի է Նկ. 11.4, որտեղ յուրաքանչյուր գագաթի նորմալը բոլոր եռանկյունների միջինացված նորմալն է, որին պատկանում է գագաթը: Այս միջինացումն իրականացվում է օբյեկտի հարթ ստվերում ստեղծելու համար:

Լուսավորության և գագաթների նորմերի օգտագործմամբ օբյեկտը նկարելիս OpenGL ES-ը կորոշի անկյունը յուրաքանչյուր գագաթի և լույսի աղբյուրի միջև: Եթե ​​նա գիտի այս անկյունը, նա կարող է հաշվարկել գագաթի գույնը՝ հիմնվելով նյութի հատկությունների վրա։ Վերջնական արդյունքը յուրաքանչյուր գագաթի գույնն է, որն այնուհետև կիրառվում է յուրաքանչյուր եռանկյունու վրա՝ համակցված մյուս գագաթների հաշվարկված գույների հետ: Օգտագործված այս գույնը կմիավորվի ցանկացած հյուսվածքային փոխակերպումների հետ, որոնք մենք կիրառում ենք օբյեկտի վրա:

Սա բավականին սարսափելի է թվում, բայց իրականում այնքան էլ վատ չէ: Մենք պետք է միացնենք լուսավորությունը և սահմանենք լույսի աղբյուրները, վերարտադրվող նյութը և գագաթի նորմալները (ի լրումն գագաթային պարամետրերի, որոնք մենք սովորաբար սահմանում ենք, օրինակ՝ դիրքի կամ հյուսվածքի կոորդինատները): Եկեք նայենք, թե ինչպես դա կարող է իրականացվել OpenGL ES-ի միջոցով:

Գործնականում

Այժմ կատարենք բոլոր այն քայլերը, որոնք անհրաժեշտ են լուսավորության հետ աշխատելու համար՝ օգտագործելով OpenGL ES: Եկեք ստեղծենք մի քանի փոքր օգնական դասեր, որոնք մի փոքր կհեշտացնեն լույսի աղբյուրների հետ աշխատանքը, և դրանք տեղադրենք com.badlogi փաթեթում with.androi dgames.framework.gl:

Լուսավորության թույլտվություն և արգելք

Ինչպես մյուս OpenGL ES վիճակների դեպքում, նախ պետք է միացնեք նշված գործառույթը: Դա կարելի է անել հետևյալ կերպ.

Դրանից հետո լուսավորությունը կկիրառվի բոլոր մատուցված օբյեկտների վրա: Արդյունքը ստանալու համար անհրաժեշտ է սահմանել լույսի աղբյուրները և նյութերը, ինչպես նաև գագաթային նորմերը: Երբ մենք ավարտում ենք բոլոր անհրաժեշտ առարկաները նկարելը, լուսավորությունը կարող է անջատվել.

Լույսի աղբյուրների որոշում

OpenGL ES-ն ապահովում է 4 տեսակի լույսի աղբյուրներ՝ հետին լույս, տեղում, ուղղորդված և լուսարձակ: Եկեք նայենք, թե ինչպես կարելի է որոշել առաջին երեքը: Որպեսզի լուսատուները արդյունավետ լինեն և լավ տեսք ունենան, յուրաքանչյուր մոդել պետք է բաղկացած լինի հսկայական թվով եռանկյուններից: Սա հնարավոր չէ շատ ընթացիկ շարժական սարքերի համար:

OpenGL ES-ը թույլ է տալիս սահմանել առավելագույնը 8 լույսի աղբյուր միաժամանակ, ինչպես նաև մեկ գլոբալ լույսի աղբյուր: Լույսի 8 աղբյուրներից յուրաքանչյուրն ունի նույնացուցիչ՝ GL10.GL LIGHT0-ից մինչև GL10.GL LIGHT7: Եթե ​​Ձեզ անհրաժեշտ է փոխել այս լույսերից մեկի հատկությունները, կարող եք դա անել՝ սահմանելով համապատասխան ID-ն:

Դուք կարող եք միացնել լույսերի օգտագործումը՝ օգտագործելով հետևյալ շարահյուսությունը.

Հաջորդը, OpenGL ES-ը կստանա այս լույսի աղբյուրի հատկությունները և կկիրառի դրանք բոլոր ցուցադրված օբյեկտների վրա: Եթե ​​մեզ անհրաժեշտ է անջատել լույսի աղբյուրի օգտագործումը, կարող ենք դա անել հետևյալ հայտարարությամբ.

Կարևորը հատուկ դեպք է, քանի որ այն չունի ID: Միայն մեկ կարևոր կետ կարող է լինել OpenGL ES տեսարանում: Եկեք ավելի սերտ նայենք այս լուսավորության աղբյուրին:

Հետին լույս

Հետևի լուսավորությունը լուսավորության հատուկ տեսակ է: Այն չունի դիրք և ուղղություն, միայն գույն է, որը հավասարապես կիրառվում է բոլոր լուսավորված առարկաների վրա: OpenGL ES-ը թույլ է տալիս սահմանել գլոբալ ընդգծումը հետևյալ կերպ.

Ambi entCol-ը կամ զանգվածը պարունակում է հետին լույսի գույնի RGBA արժեքներ, որոնք ներկայացված են որպես լողացող կետի թվեր, որոնք տատանվում են 0-ից մինչև 1: gl LightModel fv մեթոդը որպես իր առաջին պարամետր ընդունում է հաստատուն, որը նշում է, որ մենք ցանկանում ենք սահմանել ֆոնի լույսի գույնը: աղբյուրը, լողացող կետով թվերի զանգվածը, որը պարունակում է աղբյուրի գույնը և օֆսեթը լողացող զանգվածի համար, որտեղից մեթոդը կսկսի կարդալ RGBA արժեքները: Եկեք այս խնդիրը լուծող կոդը դնենք փոքր դասի մեջ: Դրա կոդը ներկայացված է Ցուցակ 11.2-ում:

Ցուցակ 11.2. Դաս AmbientLight.java: պարզ գլոբալ լուսավորության աբստրակցիա ODenGL ES

Այն ամենը, ինչ մենք անում ենք, այն է, որ ընդգծված գույնը պահում ենք լողացող զանգվածում և տրամադրում ենք երկու մեթոդ՝ մեկը օգտագործվում է գույնը սահմանելու համար, և մեկը օգտագործվում է OpenGL ES-ին ասելու համար, որ օգտագործի այդ գույնը: Նախնական գույնը մոխրագույն է:

Կետային լուսավորության աղբյուրներ

Կետային լույսերն ունեն դիրք, ինչպես նաև ֆոն, ցրված և տեսողական գույն/ինտենսիվություն (մենք չենք համարում արտանետվող գույն/ինտենսիվություն): Սահմանել տարբեր տեսակներգույները հետևյալն են.

Առաջին պարամետրը լույսի աղբյուրի նույնացուցիչն է: Այս դեպքում մենք օգտագործում ենք չորրորդ աղբյուրը. Հաջորդ պարամետրը սահմանում է այն հատկանիշը, որը մենք ցանկանում ենք փոխել: Երրորդ պարամետրը լողացող կետով թվերի զանգված է, որը պարունակում է RGBA արժեքներ, իսկ վերջինը այս զանգվածի օֆսեթն է: Աղբյուրի դիրքը որոշելը նույնքան հեշտ է.

Մենք կրկին սահմանում ենք այն հատկանիշը, որը ցանկանում ենք փոխել (այս դեպքում՝ դիրքը), չորս տարրից բաղկացած զանգված, որը պարունակում է ստեղծվող աշխարհում լույսի աղբյուրի x-, y- և z-կոորդինատները: Նկատի ունեցեք, որ զանգվածի չորրորդ տարրը պետք է հավասար լինի մեկին, եթե լույսի աղբյուրը դիրք ունի։ Եկեք սա դնենք օգնական դասարանում: Դրա կոդը պարունակվում է Ցուցակ 11.3-ում:

Ցուցակ 11.3. Point.Light.java դաս, OpenGL ES կետային լույսերի պարզ աբստրակցիա

Մեր օգնական դասը պարունակում է լույսի ֆոնային, ցրված և սպեկուլյար գունային բաղադրիչները, ինչպես նաև դիրքը (չորրորդ տարրը մեկն է): Բացի այդ, մենք պահում ենք տվյալ աղբյուրի համար օգտագործված վերջին նույնացուցիչը, ուստի հնարավոր է դառնում ստեղծել disableO մեթոդ, որը անհրաժեշտության դեպքում կանջատի լույսը։ Մենք ունենք նաև enableO մեթոդը, որը վերցնում է GL10 դասի օրինակ և լույսի աղբյուրի նույնացուցիչ (օրինակ՝ GL10.GL LIGHT6): Այն թույլ է տալիս օգտագործել լուսավորությունը, սահմանում է դրա ատրիբուտները և պահպանում օգտագործված ID-ն: DisableO մեթոդը պարզապես անջատում է լուսավորության օգտագործումը՝ օգտագործելով enable մեթոդի 1ast.Ligh.tId դասի անդամը:

Մենք օգտագործում ենք խելամիտ լռելյայն արժեքներ ֆոնային, ցրված և սպեկուլյար գույների համար՝ դասի անդամ զանգվածները սկզբնավորելիս: Լույսը կլինի սպիտակ և չի ստեղծի որևէ փայլ, քանի որ դրա տեսողական բաղադրիչը սև է:

Ուղղորդված լույսի աղբյուրներ

Ուղղորդված լույսի աղբյուրները գրեթե նույնական են կետային աղբյուրներին: Միակ տարբերությունն այն է, որ դիրքի փոխարեն ուղղություն ունեն։ Ուղղության արտահայտման ձևը որոշ չափով շփոթեցնող է: Ուղղությունը ցույց տալու համար վեկտոր օգտագործելու փոխարեն OpenGL ES-ը մեզնից ակնկալում է մեկ կետ սահմանել: Այնուհետև ուղղությունը կորոշվի՝ օգտագործելով այս կետը և սկզբնաղբյուրը կապող վեկտորը: Հետևյալ հատվածը թույլ է տալիս ստեղծել ուղղորդված լույսի աղբյուր, որը գալիս է աշխարհի աջ կողմից.

Մենք կարող ենք այն վերածել վեկտորի.

Այլ հատկանիշներ, ինչպիսիք են ֆոնը կամ ցրված գույնը, նույնական են կետային լույսի հատկանիշներին: 11.4 ցուցակը ցույց է տալիս փոքր օգնական դասի կոդը, որն օգտագործվում է ուղղորդող լույսեր ստեղծելու համար:

Ցուցակ 11.4. Directi onLi դասի ght.java, ուղղորդված լույսի աղբյուրների պարզ աբստրակցիա OpenGL ES-ում

Այս օգնական դասը գրեթե նույնական է PointLight դասին: Միակ տարբերությունն այն է, որ զանգվածի ուղղության մեջ չորրորդ տարրը մեկն է: Բացի այդ, setPosition մեթոդի փոխարեն հայտնվել է setDirecti on մեթոդը։ Այն թույլ է տալիս սահմանել ուղղությունը, օրինակ այսպես՝ (-1; 0; 0), որի դեպքում լույսը կգա աջ կողմից: Մեթոդի ներսում վեկտորի բոլոր բաղադրիչները փոխում են իրենց նշանը, ուստի ուղղությունը փոխակերպում ենք OpenGL ES-ի կողմից սպասվող ձևաչափին։

Նյութերի որոշում

Նյութը որոշվում է մի քանի հատկանիշներով. Ինչպես ցանկացած այլ OpenGL ES օբյեկտի դեպքում, նյութը այն վիճակն է, որը կմնա ակտիվ, մինչև մենք նորից չփոխենք այն, կամ OpenGL ES համատեքստը չկորչի: Ընթացիկ նյութի հատկանիշները սահմանելու համար մենք կարող ենք անել հետևյալը.

Ինչպես միշտ, մենք պետք է սահմանենք ֆոնային, ցրված և սպեկուլյար RGBA գույները: Դա կարելի է անել այնպես, ինչպես նախկինում` օգտագործելով չորս տարրերից բաղկացած լողացող կետով թվերի զանգվածներ:

Այս գործողությունները մեկ օգնական դասի մեջ համատեղելը շատ պարզ է: Արդյունքը կարող եք տեսնել Ցուցակ 11.5-ում:

Ցուցակ 11.5. Material Java դաս, OpenGL ES նյութերի պարզ աբստրակցիա

Այստեղ էլ զարմանալի ոչինչ չկա։ Մենք պարզապես պահում ենք երեք բաղադրիչ, որոնք նկարագրում են նյութը, ինչպես նաև տրամադրում են գործառույթներ՝ դրանց արժեքները սահմանելու համար և միացնել մեթոդ, որը դրանք փոխանցում է OpenGL ES-ին:

OpenGL ES-ն ունի ևս մեկ ցուպ իր ձեռքում, երբ խոսքը վերաբերում է նյութերին: Այն սովորաբար օգտագործում է մի բան, որը կոչվում է նյութի գույն՝ glMaterialfvO մեթոդի փոխարեն: Սա նշանակում է, որ glMateri al fv մեթոդով որոշված ​​ֆոնի և ցրված գույների փոխարեն, OpenGL ES-ը կվերցնի մեր մոդելների գագաթների գույնը որպես նյութի ֆոն և ցրված գույներ: Այս հատկությունը միացնելու համար պարզապես զանգահարեք այն.

Սովորաբար դա այն է, ինչ ես անում եմ, քանի որ ֆոնն ու ցրված գույները հաճախ նույնն են: Քանի որ ես իմ խաղերի և ցուցադրությունների մեծ մասում չեմ օգտագործում առանձնահատուկ շեշտադրումներ, ես հեշտությամբ կարող եմ օգտագործել այս մեթոդը և ընդհանրապես չանվանել glMaterial fv մեթոդը: Այն օգտագործելու եղանակը ձեր որոշելիքն է:

Նորմալների սահմանում

Որպեսզի լուսավորությունը աշխատի OpenGL ES-ում, դուք պետք է մոդելի յուրաքանչյուր գագաթի համար սահմանեք գագաթային նորմեր: Գագաթի նորմալը պետք է լինի միավոր վեկտոր, որը ցույց է տալիս (սովորաբար) այն ուղղությամբ, որով պտտվում է այն մակերեսը, որին պատկանում է գագաթը: Նկ. Նկար 11.5-ը ցույց է տալիս մեր խորանարդի գագաթների նորմերը:

Բրինձ. 11.5. Վերտեքսի նորմալները մեր խորանարդի յուրաքանչյուր գագաթի համար

Նորմալ գագաթը գագաթի մեկ այլ հատկանիշ է, ինչպես դիրքը կամ գույնը: Vertex normals-ից օգտվելու համար մենք պետք է նորից փոխենք Verti ces3 դասը: OpenGL ES-ին ասելու համար, թե որտեղ կարող է գտնել նորմալներ յուրաքանչյուր գագաթի համար, մենք կօգտագործենք gl Normal PointerO մեթոդը, ինչպես նախկինում օգտագործում էինք gl VertexPointer կամ gl Col կամ Pointer մեթոդները: Ցուցակ 11.6-ը ցույց է տալիս Vertices3 դասի վերջնական տարբերակը:

Ցուցակ 11.6. Vertices3.Java դաս, վերջնական տարբերակ, որն աջակցում է նորմալներին

Դասարանը ունի նոր անդամ hasNormal.s, որը հետևում է, թե արդյոք գագաթները ունեն նորմալներ:

Կոնստրուկտորն այժմ ընդունում է նաև hasNormals պարամետրը: Մենք դեռ պետք է փոփոխենք vertexSize անդամի հաշվարկը՝ հնարավորության դեպքում յուրաքանչյուր գագաթին ավելացնելով երեք լողացող:

Ինչպես տեսնում եք, setVertices և setlndices մեթոդները մնում են անփոփոխ:

BindO մեթոդում, որը մենք հենց նոր ցուցադրեցինք, մենք օգտագործում ենք նույն տեխնիկան ByteBuffer-ի հետ, ինչ նախկինում, բայց այս անգամ ավելացնում ենք նորմալներ՝ օգտագործելով gl Normal Pointer մեթոդը: Նորմալ ցուցիչի օֆսեթը հաշվարկելու համար անհրաժեշտ է հաշվի առնել, թե արդյոք նշված են հյուսվածքի և գույնի կոորդինատները:

Ինչպես տեսնում եք, խաղարկության մեթոդը նույնպես չի փոխվել. ամբողջ գործողությունը տեղի է ունենում bind մեթոդով O.

Ի վերջո, մենք մի փոքր փոփոխում ենք unbindO մեթոդը: Մենք անջատում ենք սովորական ցուցիչների օգտագործումը, եթե այդպիսիք կան՝ համապատասխանաբար մաքրելով OpenGL ES վիճակը:

Փոփոխված Verti ces3 դասի կիրառումը նույնքան հեշտ է, որքան նախկինում: Դիտարկենք մի փոքրիկ օրինակ.

Մենք ստեղծում ենք լողացող կետային զանգված երեք գագաթներ պահելու համար, որոնցից յուրաքանչյուրն ունի դիրք (յուրաքանչյուր շարքի առաջին երեք թվերը) և նորմալ (յուրաքանչյուր շարքի վերջին երեք թվերը): Այս դեպքում մենք սահմանում ենք եռանկյուն xy հարթությունում, որի նորմերը ուղղված են z առանցքի դրական մասի ուղղությամբ։

Մեզ մնում է միայն ստեղծել Vertices3 դասի օրինակ և սահմանել գագաթների արժեքները: Բավականին հեշտ է, այնպես չէ՞:

Բոլոր կապակցման, գծագրման և անջատման աշխատանքները կատարվում են ճիշտ այնպես, ինչպես դասի նախորդ տարբերակում: Ինչպես նախկինում, մենք կարող ենք ավելացնել գագաթային գույները և հյուսվածքների կոորդինատները:

Այս ամենը միասին դնելով

Եկեք այս ամենը միասին հավաքենք: Մենք պետք է նկարենք մի տեսարան, որն ունի գլոբալ լուսավորություն, կետային և ուղղորդված լույսի աղբյուրներ: Նրանք կլուսավորեն սկզբնամասում գտնվող խորանարդը։ Մենք նաև պետք է կոչենք gl uLookAt մեթոդը: տեսախցիկը տեղադրելու համար: Նկ. 11.6 ցույց է տրված տեսքըմեր աշխարհը.

Ինչպես մյուս բոլոր օրինակներում, եկեք ստեղծենք LightTest կոչվող դաս՝ սովորականի պես ընդլայնելով GLGame դասը: Այն կվերադարձնի LightScreen դասի օրինակ՝ օգտագործելով getStartScreenO մեթոդը: LightScreen դասը ժառանգում է GLScreen դասից (Ցուցակ 11.7):

Բրինձ. 11.6. Մեր առաջին լուսավոր տեսարանը

Ցուցակ 11.7. LightTest.java դասի հատվածներ։ ստեղծելով լուսավորություն OpenGL ES-ի միջոցով

Սկսենք դասարանի մի քանի անդամների նկարագրելով: Անկյունի անդամը պահպանում է տեղեկատվություն y առանցքի շուրջ խորանարդի պտտման ընթացիկ անկյան մասին։ Verti ces3 անդամը պահպանում է խորանարդի մոդելի գագաթները, որոնք մենք շուտով կսահմանենք: Բացի այդ, մենք ունենք AmbientLight, PointLight և Directional Light դասերի օրինակներ, ինչպես նաև Material դասի օրինակ։

Հաջորդը գալիս է կոնստրուկտորը: Այստեղ ստեղծվում են խորանարդի մոդելի գագաթները, և բեռնվում է տուփի հյուսվածքը։ Մենք նաև նախաստորագրում ենք լույսերն ու նյութերը: Հետին լույսի գույնը բաց կանաչ է: Ուղղորդված աղբյուրը կարմիր է և գտնվում է մեր աշխարհի (3; 3; 0) կետում: Ուղղորդված լույսի աղբյուրը կապույտ ցրված գույն ունի, լույսն ընկնում է ձախից։ Նյութի համար մենք օգտագործում ենք լռելյայն արժեքները (որոշակի ֆոն, սպիտակ՝ ցրված բաղադրիչի համար և սև՝ սպեկուլյար բաղադրիչի համար):

Ռեզյումեի մեթոդում մենք համոզվում ենք, որ մեր հյուսվածքը (վեր)բեռնված է, եթե համատեքստը կորչում է:

CreateCube մեթոդը ըստ էության անփոփոխ է նախորդ օրինակներից: Այնուամենայնիվ, այս անգամ մենք նորմալներ ենք ավելացնում յուրաքանչյուր գագաթին, ինչպես ցույց է տրված Նկ. 11.5. Բացի այդ ամեն ինչ մնում է նույնը:

Թարմացման մեթոդում մենք պարզապես մեծացնում ենք խորանարդի պտտման անկյունը։

Այստեղ ավելի հետաքրքիր է դառնում: Առաջին մի քանի տողերը կաթսայատան կոդ են՝ գույնի և խորության բուֆերը մաքրելու, խորության փորձարկումը միացնելու և շրջանակը սահմանելու համար:

Այնուհետև մենք սահմանում ենք պրոյեկցիոն մատրիցը հավասար հեռանկարային պրոյեկցիայի մատրիցին, օգտագործելով gl uPerspecti ve մեթոդը, ինչպես նաև օգտագործում ենք gl uLookAt մեթոդը մոդելի դիտման մատրիցայի համար, որի շնորհիվ տեսախցիկը աշխատում է նույնը, ինչ Նկ. 11.6.

Այնուհետեւ մենք թույլ ենք տալիս օգտագործել լուսավորությունը: Այս պահին լույսեր դեռ չեն սահմանվել, ուստի մենք դրանք սահմանում ենք հաջորդ մի քանի տողերում՝ մեթոդը անվանելով լույսերի և նյութերի վրա:

Ինչպես միշտ, մենք նաև միացնում ենք տեքստուրավորումը և կապում տուփի հյուսվածքը: Ի վերջո, մենք կոչում ենք gl RotatefC) մեթոդը՝ խորանարդը պտտելու համար, այնուհետև նկարում ենք նրա գագաթները՝ օգտագործելով լավ տեղադրված կանչեր դեպի Verti ces3 դասի օրինակ:

Մեթոդի վերջում մենք անջատում ենք տեղում և ուղղորդող լույսերը (հիշեք, հետին լուսավորությունը գլոբալ վիճակ է), ինչպես նաև հյուսվածքների և խորության փորձարկումը: Այսքանը OpenGL ES-ում լուսավորելու համար:

Դասասենյակի մնացած մասը դատարկ է. Մենք դադարի դեպքում որևէ գործողություն կատարելու կարիք չունենք։ Նկ. Նկար 11.7-ում ներկայացված է ծրագրի արդյունքը:

Բրինձ. 11.7. Տեսարանը, որը ներկայացված է Նկ. 11.6, մատուցված OpenGL ES-ով

OpenGL ES-ում լուսավորության մասին մի քանի նշում

Թեև լուսավորության օգտագործումը կարող է համը հաղորդել ձեր խաղին, այն ունի իր սահմանափակումներն ու որոգայթները: Կան մի քանի բաներ, որոնց մասին պետք է տեղյակ լինեք:

Լուսավորման օգտագործումը չափազանց շատ ռեսուրսներ է սպառում, հատկապես դանդաղ սարքերի վրա: Զգուշորեն օգտագործեք լուսավորությունը: Որքան շատ լույսի աղբյուրներ նկարագրեք, այնքան ավելի շատ հաշվարկներ կպահանջվեն տեսարանը ցուցադրելու համար:

Կետային/ուղղորդված լույսի աղբյուրների դիրքը/ուղղությունը պետք է որոշվի այն բանից հետո, երբ տեսախցիկի մատրիցաները բեռնվեն, և մինչև մոդելի դիտման մատրիցը բազմապատկվի ցանկացած այլ մատրիցով՝ առարկաները տեղափոխելու և պտտելու համար: Սա կրիտիկական է: Եթե ​​այս հրահանգները չկատարվեն, կարող են առաջանալ անբացատրելի լույսի արտեֆակտներ:

Երբ դուք օգտագործում եք gl Seal ef մեթոդը՝ մոդելի չափերը փոխելու համար, նրա նորմերը նույնպես կմեծացվեն: Սա վատ է, քանի որ OpenGL ES-ն ակնկալում է, որ նորմալները տվյալ միավորներում ունենան պարամետրեր: Այս խնդիրը լուծելու համար կարող եք օգտագործել glEnable(GL10.GL NORMALIZE) հրամանը կամ, որոշ դեպքերում, gl Enable (GL10 .GL RESCALE N0RMAL): Կարծում եմ, որ առաջին հրամանը պետք է օգտագործվի, քանի որ երկրորդի օգտագործումն ունի սահմանափակումներ և թակարդներ։ Խնդիրն այն է, որ նորմալների նորմալացումը կամ չափափոխումը պահանջում է մեծ պրոցեսորային հզորություն: Կատարողականի տեսանկյունից լավագույն լուծումը լուսավորված օբյեկտների մասշտաբները չմեծացնելն է:

Դե, պարոնայք։ Վերջերս մենք բավականին շատ բան ենք սովորել OpenGL-ի մասին, այդ թվում՝ ինչպես անել վերահսկել տեսախցիկը , աշխատել հյուսվածքների հետ, և նաև հետ մոդելներ. Ժամանակն է խոսել շատ ավելի հետաքրքիր բանի, այն է՝ լուսավորության մասին: Այս թեման հետաքրքիր է, քանի որ OpenGL-ում լույսի հետ աշխատելու համար պատրաստ ոչինչ չկա, ամեն ինչ պետք է ինքնուրույն գրել՝ օգտագործելով ստվերներ։ Այս գրառման մեջ մենք կանդրադառնանք Phong լուսավորությանը: Սա բավականին մեծ թեմա է, ուստի մենք կխոսենք բացառապես լուսավորություն. Այն, թե ինչպես են դրանք պատրաստվում ստվերներ, մենք պետք է դա պարզենք մեկ այլ անգամ:

Նորմալների պահպանում և օգտագործում

Նախքան ուղղակիորեն լուսավորության անցնելը, մեզ անհրաժեշտ է այնպիսի բան, ինչպիսին նորմալ է:

Մենք արդեն գիտենք, որ մոդելներն ունեն այս գագաթներին համապատասխանող գագաթներ և ուլտրամանուշակագույն կոորդինատներ: Լուսավորություն ստեղծելու համար մեզ անհրաժեշտ է ավելի շատ տեղեկություններ մոդելների, մասնավորապես՝ նորմալների մասին: Նորմալը միավորի վեկտորն է, որը համապատասխանում է գագաթին (կամ, որպես այլընտրանք, բազմանկյունին, բայց դա մեր դեպքը չէ): Թե ինչ դեր են խաղում նորմալները լուսավորության իրականացման գործում, մենք կիմանանք ստորև: Առայժմ բավական է ասել, որ նորմալներն իսկապես շատ կարևոր են: Օրինակ, դրանց շնորհիվ մակերեսները ավելի հարթ տեսք ունեն, և դուք կարող եք տարբերել գնդակը սովորական ուռուցիկ բազմանիստից, ինչպես իկոսաեդրոնը: Եվ քանի որ նորմալները շատ կարևոր են, մենք պետք է սովորենք, թե ինչպես պահպանել դրանք Blender մոդելները մեր սեփական ձևաչափի փոխարկելիս:

Համապատասխան փոփոխությունները բավականին տրիվիալ են։ Մենք ստանում ենք նորմալները այնպես, ինչպես ստացանք գագաթային կոորդինատները և ուլտրամանուշակագույն կոորդինատները.

// մի մասը ընթացակարգի մարմնի importedModelCreate

համար (անստորագիր int j = 0; j< face.mNumIndices ; ++ j) {
unsigned int index = face.mIndices[ j] ;
aiVector3D pos = mesh->mVertices[ index] ;
aiVector3D uv = mesh-> mTextureCoords[ 0] [ինդեքս];
aiVector3D normal = mesh-> mNormals[ index] ;

VerticesBuffer[ verticesBufferIndex++] = pos.x;
verticesBuffer[ verticesBufferIndex++] = pos.y;
verticesBuffer[ verticesBufferIndex++] = pos.z;
verticesBuffer[ verticesBufferIndex++ ] = normal.x ;
verticesBuffer[ verticesBufferIndex++] = normal.y;
verticesBuffer[ verticesBufferIndex++] = normal.z;
verticesBuffer[ verticesBufferIndex++] = uv.x;
verticesBuffer[ verticesBufferIndex++] = 1.0f - uv.y;
}

Մոդելի օպտիմալացման ընթացակարգը փոխվում է նույն կերպ: Իսկ modelLoad ընթացակարգում երկու հատկանիշի զանգվածների փոխարեն այժմ մեզ անհրաժեշտ է երեքը՝

// modelLoad ընթացակարգի մարմնի մաս

GlBindVertexArray (modelVAO);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

GlBindBuffer(GL_ARRAY_BUFFER, modelVBO);
glBufferData(GL_ARRAY_BUFFER, header- > verticesDataSize, verticesPtr,
GL_STATIC_DRAW);

GLsizei stride = 8 * sizeof(GLfloat) ;
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, nullptr);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, քայլք,
(const void * ) (3 * sizeof (GLfloat) ) ;
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, քայլք,
(const void * ) (6 * sizeof (GLfloat) ) );

Մեզ նաև լրացուցիչ անհրաժեշտ է միատեսակ փոփոխական՝ M մատրիցով.

GLint uniformM = getUniformLocation(programId, «M»);

// ...

GlUniformMatrix4fv(uniformM, 1, GL_FALSE, & towerM[0] [0]);

... գագաթի ստվերում տարածության մեջ նորմալը ճիշտ պտտելու համար.

#տարբերակ 330 միջուկ

Դասավորություն (գտնվելու վայրը = 0) vec3 vertexPos-ում;
դասավորություն (գտնվելու վայրը = 1) vec3 vertexNorm-ում;
դասավորություն (գտնվելու վայրը = 2) vec2 vertexUV-ում;

համազգեստ mat4 MVP;
համազգեստ mat4 M;

դուրս vec2 բեկոր UV;
դուրս vec3 հատվածՆորմալ;
դուրս vec3 fragmentPos;

void main() (
fragmentUV = vertexUV;
fragmentNormal = (M * vec4 (vertexNorm, 0 ) ): xyz ;
fragmentPos = (M * vec4 (vertexPos, 1 ) ): xyz ;

gl_Position = MVP * vec4 (vertexPos, 1);
}

Վերջապես, բեկորային ստվերը վերցնում է նորմալ ինտերպոլացված երեք գագաթներով.

// ...

void main() (

// ...
}

Այս պարզ ձևով մենք ստանում ենք նորմերը բեկորներ.

Ի՞նչ է Phong լուսավորությունը:

Ինչպես նշվեց, OpenGL-ում լուսավորությունը ստվերներով գրված է հենց ծրագրավորողի կողմից: Հասկանալի է, որ այս լուսավորությունն իրականացնելու մեկից ավելի եղանակ կա, որոնցից յուրաքանչյուրն ունի իրատեսականության իր աստիճանը և ռեսուրսների պահանջները: Եվ յուրաքանչյուր մեթոդ դեռ կարող է ունենալ անթիվ կոնկրետ իրականացումներ: Ինչից ես հասկանում եմ, արդյունավետ և իրատեսական իրական ժամանակի լուսավորությունը դեռևս ակտիվ հետազոտության ոլորտ է: Այս գրառման համար մենք կանդրադառնանք Phong լուսավորությանը, որը և՛ բավականին իրատեսական է, և՛ հեշտ իրագործելի:

Կարևոր է հասկանալ հետևյալ հասկացությունների միջև եղած տարբերությունը.

  • Gouraud ստվերավորումն այն է, երբ հաշվարկում եք յուրաքանչյուր գագաթի լուսավորությունը, և դրանց միջև ընկած հատվածների լուսավորությունը ինտերպոլացվում է.
  • Phong ստվերում - երբ լուսավորությունը հաշվարկվում է առանձին յուրաքանչյուր հատվածի համար.
  • Phong լուսավորությունը կամ Phong արտացոլման մոդելը հատուկ լուսավորության մեթոդ է, որը քննարկվում է այս հոդվածում, և որը կարող է օգտագործվել ինչպես Gouraud-ի, այնպես էլ Phong-ի ստվերում:

Զարմանալի չէ, որ Phong ստվերավորումն ու Phong լուսավորությունը հաճախ շփոթվում են, և որոշ ձեռնարկներում դուք կարող եք կարդալ այնպիսի անհեթեթություն, ինչպիսին է «Phong-ի ստվերավորման գաղափարը երեք բաղադրիչ օգտագործելն է...», ինչը ձեզ անմիջապես ստիպում է խիստ կասկածել հեղինակության վրա: մարդ, ով գրել է այս ձեռնարկը:

Որքան հասկացա, ժամանակակից կիրառություններում Gouraud ստվերավորումը գրեթե չի օգտագործվում, փոխարենը նախընտրելի է Phong ստվերավորումը։ Այս գրառման մեջ մենք կօգտագործենք նաև Phong shading-ը, այսինքն՝ յուրաքանչյուր հատվածի համար լուսավորությունը կհաշվարկվի առանձին։ Լուսավորման հատուկ մեթոդը, որը մենք կօգտագործենք, Phong լուսավորությունն է: Այս մեթոդը հետևյալն է.

Լուսավորման երեք բաղադրիչները հաշվարկվում են տարբեր բանաձևերով.

  • Շրջակա միջավայրի լուսավորությունը լույսի իմիտացիա է, որը հասել է որոշակի կետի՝ այլ առարկաներից արտացոլվելուց հետո: Ֆոնային լուսավորությունը հաշվարկելիս հաշվի չեն առնվում ոչ նորմալները, ոչ էլ տեսախցիկի ներկայիս դիրքը.
  • Ցրված լուսավորությունը լույս է աղբյուրից, որը ցրվում է տվյալ կետին հարվածելուց հետո: Կախված լույսի անկումից, լուսավորությունը դառնում է ավելի ուժեղ կամ թույլ: Սա հաշվի է առնում նորմալները, բայց ոչ տեսախցիկի դիրքը.
  • Տեսակետային լուսավորությունը լույս է աղբյուրից, որը արտացոլվում է տվյալ կետին հարվածելուց հետո: Արտացոլված լույսը տեսանելի է, եթե այն մտնում է տեսախցիկ: Հետևաբար, այստեղ հաշվի են առնվում և՛ նորմալները, և՛ տեսախցիկի դիրքը.

Արդյունքներն այնուհետև ամփոփվում են՝ ընդհանուր լուսավորությունը տալու համար:

Իրերն էլ ավելի հետաքրքիր դարձնելու համար կան լույսի տարբեր աղբյուրներ: Ակնհայտ է, որ դրսում արևը և մթության մեջ լապտերը շատ այլ կերպ են լուսավորում տեսարանը: Նախ, մենք կանդրադառնանք ամենապարզ աղբյուրին `ուղղորդված լույսը:

Ուղղորդող լույս

Ուղղորդված լույսը անսահման հեռավոր լույսի աղբյուրի իմիտացիա է: Օրինակ վերցնենք Արևը։ Արևը շատ հեռու է երկրից: Հետևաբար, Երկրի մակերեսին Արեգակից եկող բոլոր լույսի ճառագայթները մեծ ճշգրտությամբ կարելի է զուգահեռ համարել։ Ուղղորդված լույսը բնութագրվում է իր ուղղությամբ, գույնով, ինչպես նաև որոշ գործակիցներով, որոնք մեզ անհրաժեշտ կլինեն ստորև.

Ուղղորդող լույսի կառուցվածք (
vec3 ուղղություն;

vec3 գույն;
float ambientIntensity;
float diffuseIntensity;
float specularIntensity;
} ;

Fragment shader կոդի մեջ մենք կսահմանենք calcDirectionalLight ընթացակարգ, որը կօգտագործվի այսպես.

vec3 fragmentPos-ում;
համազգեստ vec3 cameraPos;
միասնական DirectionalLight ուղղորդվածԼույս;

// ...

void main() (
// նորմալը պետք է շտկվի ինտերպոլացիայից հետո
vec3 normal = նորմալացնել (fragmentNormal) ;


ուղղորդող լույս);

// ...
}

Դիտարկենք ընթացակարգի իրականացումը.

vec4 calcDirectionalLight(vec3 նորմալ, vec3 հատվածToCamera,
Ուղղորդող լույս) (
vec4 ambientColor = vec4 (թեթև. գույն, 1) * լույս. շրջակա միջավայրի ինտենսիվություն;

// ...
}

Նախ, հաշվարկվում է առաջին բաղադրիչը `ֆոնային լուսավորություն: Դա ուղղակի արտանետվող լույսի գույնն է՝ բազմապատկված ֆոնային լույսի ինտենսիվությամբ: Մինչ այժմ ամեն ինչ պարզ է.

// ...

float diffuseFactor = max (0.0 , dot (normal, - light. ուղղություն ) );
vec4 diffuseColor = vec4 (թեթև. գույն, 1) * լույս. diffuseIntensity
* diffuseFactor;

// ...

Ցրված լուսավորություն. DiffuseFactor փոփոխականը ներկայացնում է անկյան կոսինուսը բեկորից նորմալի և հատվածից դեպի լույսի աղբյուր ուղղվող վեկտորի միջև։ Եթե ​​լույսը դիպչում է մակերեսին ուղղահայաց, ապա անկյունը զրո է: Այս անկյան կոսինուսը հավասար է մեկի, իսկ լուսավորությունը՝ առավելագույնը (տե՛ս Վիքիպեդիայի հոդվածը Լամբերտի օրենքի մասին)։ Անկյունի մեծացման հետ կոսինուսը նվազում է և հավասարվում է զրոյի, եթե լույսը զուգահեռ է մակերեսին։ Եթե ​​կոսինուսը բացասական է, ապա լույսի աղբյուրը գտնվում է ինչ-որ տեղ մակերեսի հետևում և այն լուսավորված չէ, ուստի մենք բացասական արժեքները դարձնում ենք զրոյի՝ օգտագործելով max(0.0, ...): Բացի լույսի անկման անկյունից, հաշվի է առնվում նաև ցրված լույսի ցրված ինտենսիվությունը։

// ...
vec3 lightReflect = normalize(reflect(light. ուղղություն, նորմալ));
float specularFactor = pow(
առավելագույնը (0.0, կետ (fragmentToCamera, lightReflect),
materialSpecularFactor
) ;
vec4 specularColor = լույս: տեսողական ինտենսիվություն * vec4 (թեթև. գույն, 1)
* նյութի սպեկուլյար ինտենսիվություն * սպեկուլյարՖակտոր;
// ...

Անուղղակի լուսավորություն. LightReflec փոփոխականը միավոր վեկտոր է, որը սահմանում է արտացոլված լույսի ուղղությունը: SpecularFactor փոփոխականը հաշվարկվում է diffuseFactor-ի նման ձևով, միայն այս անգամ այն ​​հաշվի է առնում անկյան կոսինուսը այն ուղղության միջև, որով արտացոլվել է լույսը և ուղղությունը հատվածից դեպի տեսախցիկ: Եթե ​​այս անկյունը զրոյական է, ապա արտացոլված լույսը թռչում է անմիջապես տեսախցիկի մեջ, և մակերեսի փայլը առավելագույնն է: Եթե ​​անկյունը մեծ է, ապա ոչ մի շող չպետք է տեսանելի լինի: Այստեղ materialSpecularFactor-ը միատեսակ փոփոխական է: Որքան մեծ է այն, այնքան փոքր է օբյեկտի մակերեսի վրա շողալու տարածքը: MaterialSpecularIntensity փոփոխականն օգտագործվում է նաև կարևոր կետերի պայծառությունը որոշելու համար: Նկատի ունեցեք, որ սրանք բոլորը նյութի հատկություններն են, ոչ թե լույսը: Օրինակ, մետաղը արտացոլում է լույսը և, հետևաբար, ունի փայլ: Բայց փայտը չի արտացոլում լույսը, և այնուհետև ծառերի վրա դուք երբեք փայլ չեք տեսնում (իհարկե, եթե մակերեսը չոր է և այլն):

Վերևի կոդում լույսն ունի սպեկուլյար ինտենսիվության հատկություն: Բայց այն պետք է օգտագործվի միայն վրիպազերծման նպատակներով՝ առանձնահատուկ լույսի աղբյուրից ընդգծված շեշտադրումները ընդգծելու համար: Կոդի թողարկման տարբերակում այս գործակիցը կամ պետք է հավասար լինի մեկին, կամ ամբողջությամբ հեռացվի ծածկագրից։

Վերջում ավելացվում են երեք բաղադրիչները և արդյունքը վերադարձվում է.

// ...

վերադարձնել ambientColor + diffuseColor + specularColor;
}

Այնքան էլ դժվար չէ, չէ՞:

Կետային լույսի աղբյուր

Լույսի կետային աղբյուրը, օրինակ, վառվող լամպն է: Լամպի լույսն ուղղված է բոլոր ուղղություններով: Հետևաբար, կետային լույսի աղբյուրը բնութագրվում է ոչ թե լույսի ուղղությամբ, այլ բնութագրվում է աղբյուրի դիրքով տարածության մեջ.

struct PointLight (
vec3 դիրքը;

vec3 գույն;
float ambientIntensity;
float diffuseIntensity;
float specularIntensity; // վրիպազերծման նպատակով, պետք է սահմանվի 1.0
} ;

Կետային լույսի աղբյուրից լուսավորությունը հեշտությամբ հաշվարկվում է արդեն գոյություն ունեցող calcDirectionalLight ընթացակարգով.

vec4 calcPointLight (vec3 նորմալ, vec3 բեկոր ToCamera,
PointLight լույս) (
vec3 lightDirection = normalize (fragmentPos - light. position ) ;
float հեռավորությունը = երկարություն (fragmentPos - թեթեւ. դիրքը ) ;
float pointFactor = 1.0 / (1.0 + pow(հեռավորություն, 2));

DirectionalLight tempDirectionalLight = DirectionalLight(
լույսի ուղղություն,
լույս. գույն,
լույս. շրջակա միջավայրի ինտենսիվությունը
լույս. diffuseIntensity
լույս. սպեկուլյար ինտենսիվություն
) ;
վերադարձի կետFactor * calcDirectionalLight (նորմալ, fragmentToCamera,
tempDirectionalLight);
}

Ունենալով հատվածի և լույսի աղբյուրի կոորդինատները՝ վեկտորների տարբերության միջոցով հեշտությամբ կարող եք հաշվարկել լույսի ուղղությունը տվյալ հատվածին։ PointFactor բազմապատկիչն արտացոլում է այն փաստը, որ լույսը թուլանում է իր աղբյուրի հեռավորության քառակուսու հետ (համաձայն ոլորտի մակերեսի շառավղից կախվածության բանաձևի): PointFactor-ը հաշվարկելիս բաժանարարին ավելացվում է հավելյալ մեկը՝ զրոյի բաժանելու հնարավորությունը կանխելու համար։ Դրանից հետո ամեն ինչ հաշվարկվում է ճիշտ այնպես, ինչպես ուղղորդված լույսի համար:

կետային լույս

Այս լույսի աղբյուրի օրինակ է լապտերը: Այն նման է կետային լույսի աղբյուրին, միայն այն լրացուցիչ ունի ուղղություն և ազդեցության անկյուն (կտրվածք).

struct SpotLight (
vec3 ուղղություն;
vec3 դիրքը;
լողացող կտրվածք;

vec3 գույն;
float ambientIntensity;
float diffuseIntensity;
float specularIntensity; // վրիպազերծման նպատակով, պետք է սահմանվի 1.0
} ;

Համապատասխան ընթացակարգ.

vec4 calcSpotLight(vec3 նորմալ, vec3 հատվածToCamera,
SpotLight լույս) (
vec3 spotLightDirection = նորմալացնել (fragmentPos - light. position ) ;
float spotAngleCos = կետ (spotLightDirection, light. ուղղություն) ;
լողացող թուլացում = (1.0 - 1.0 * (1.0 - spotAngleCos) /
(1.0 - թեթեւ. անջատում) );
float spotFactor = float (spotAngleCos > light. cutoff ) * թուլացում;

PointLight tempPointLight = PointLight(
լույս. դիրք
լույս. գույն,
լույս. շրջակա միջավայրի ինտենսիվությունը
լույս. diffuseIntensity
լույս. շրջակա միջավայրի ինտենսիվությունը
) ;
վերադարձի spotFactor * calcPointLight (նորմալ, fragmentToCamera,
tempPointLight);
}

Լույսի ուղղությունը հաշվարկվում է այնպես, ինչպես կետային աղբյուրի համար: Այնուհետև հաշվարկվում է այս ուղղության և լույսի աղբյուրի հատկություններում նշված ուղղության միջև ընկած անկյան կոսինուսը: Օգտագործելով արտահայտությունը float (spotAngleCos > light.cutoff)լույսը խստորեն սեղմված է նշված անկյան տակ: Թուլացման բազմապատկիչն ավելացնում է հարթլույսի թուլացում, երբ բեկորները հեռանում են աղբյուրի հատկություններում նշված լույսի ուղղությունից: Դրանից հետո բոլոր հաշվարկները վերածվում են կետային լույսի աղբյուրի հաշվարկների:

Գամմայի ուղղում

Fragment shader-ի ամբողջ հիմնական պրոցեդուրան այսպիսի տեսք ունի.

void main() (
// նորմալը պետք է շտկվի ինտերպոլացիայից հետո
vec3 normal = նորմալացնել (fragmentNormal) ;
vec3 fragmentToCamera = normalize(cameraPos - fragmentPos) ;

vec4 directColor = calcDirectionalLight (նորմալ, fragmentToCamera,
ուղղորդող լույս);
vec4 pointColor = calcPointLight (նորմալ, հատված ToCamera,
կետ Լույս);
vec4 spotColor = calcSpotLight (նորմալ, fragmentToCamera, spotLight) ;
vec4 linearColor = հյուսվածք (հյուսվածքի նմուշառում, հատված UV) *
(vec4 (նյութի արտանետում, 1) + directColor +
pointColor + spotColor);

vec4 գամմա = vec4 (vec3 (1.0 / 2.2) , 1);
գույն = pow (գծայինԳույն, գամմա); // գամմա-շտկված գույն
}

Մեծ ուշադրություն մի դարձրեք նյութի արտանետմանը: Սա նյութի ևս մեկ հատկություն է, որն ավելացնում է իր սեփական փայլը: Շատ առարկաներ ինքնուրույն փայլում են: Վերցրեք նույն լամպերը, որոնք ծառայում են որպես լույսի աղբյուր այլ առարկաների համար: Մենք պետք է կարողանանք տեսնել դրանք կատարյալ մթության մեջ, նույնիսկ եթե լամպերը լուսավորված չեն լույսի որևէ այլ աղբյուրով, այնպես չէ՞:

Այն, ինչ իսկապես արժանի է ուշադրության, գամմա ուղղումն է, որը բաղկացած է բոլոր լուսային բաղադրիչները 1/2,2 հզորության բարձրացումից: Մինչ այժմ մենք աշխատում էինք գծային գունային տարածության մեջ՝ ենթադրելով, որ 1.0 ինտենսիվությամբ գույնը երկու անգամ ավելի վառ է, քան 0.5 ինտենսիվությամբ գույնը: Խնդիրն այն է, որ մարդու աչքը պայծառությունը գծային չի ընկալում։ Հետևաբար, իրատեսական լուսավորություն ստանալու համար անհրաժեշտ է կատարել գամմա ուղղում գծային տարածության բոլոր հաշվարկներից հետո:

Պետք է հաշվի առնել, որ պատկերը պահպանելիս ժամանակակից գրաֆիկական խմբագրիչները կատարում են նաև գամմա ուղղում։ Հետեւաբար, նախքան հյուսվածքներ օգտագործելը, դուք պետք է չեղարկեք այս գամմա ուղղումը: Բարեբախտաբար, դա դժվար չէ:

Բավական է փոխարինել հյուսվածքի բեռնման կոդի բոլոր հաստատունները.

GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT

GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT

… համապատասխանաբար: Սա ցույց կտա, որ պատկերի վրա կիրառվել է գամմա ուղղում և պետք է հետարկել: Մնացածի մասին կհոգա OpenGL-ը:

Իրական հավելվածներում գամմա պարամետրը (մենք ունենք գամմա = 2.2) ավելի լավ է տեղադրվում ծրագրի կարգավորումներում, որպեսզի օգտագործողը ցանկության դեպքում մի փոքր հարմարեցնել այն իր մոնիտորի վրա:

Եզրակացություն

Ժամանակն է նայելու նկարները։

Այստեղ մենք տեսնում ենք տարբեր լուսավորության բաղադրիչներ: Ձախից աջ, վերևից ներքև՝ ֆոն, ցրված, արտացոլված, երեքը միասին: Ինչպես տեսնում եք, դեպքի վայրում ավելացվել է տորուսի մոդել։ Նորմալների բարդ տեղադրման շնորհիվ այս մոդելը խորհուրդ է տրվում լուսավորության փորձարկման համար:

Լույսի տարբեր աղբյուրներ: Ձախից աջ, վերևից ներքև՝ սպիտակ կետային լույս, կարմիր կետային լույս, կապույտ լուսարձակ, երեքը միասին:

Կրկին նշեմ, որ լուսավորության նույն մեթոդը կարող է ունենալ տարբեր իրականացումներ: Օրինակ, դուք կարող եք նյութի հատկությունները սահմանել շրջակա, ցրված և տեսողական գույնի, ինչը թույլ կտա նկարել կարմիր առարկաներ, որոնք ցրված են կանաչ և ունեն կապույտ շեշտադրումներ: Phong-ի լուսավորության որոշ ծրագրերում ես տեսել եմ, որ ֆոնային լուսավորությունը հաշվարկվում է մեկ անգամ, քան յուրաքանչյուր լույսի համար: Ես նաև տեսա իրագործումներ, որտեղ կետային աղբյուրից լույսը խամրեց ոչ թե պարզապես դեպի իրեն հեռավորության քառակուսին համաչափ (d * d), այլ ավելի ընդհանուր բանաձևի համաձայն (A + B*d + C* ոճով): դ*դ). Ինչ-որ մեկը շրջապատող ինտենսիվությունը և ցրված ինտենսիվությունը դարձնում է ոչ միայն լույսի աղբյուրի, այլև նյութի հատկություն: Այնուամենայնիվ, ես վստահ չեմ, թե որքանով է այս ամենը կապված իրատեսական լուսավորության հետ: Բայց այս ամենի հետ կարելի է խաղալ որպես տնային աշխատանք։

Տարիների գործեր. Վոլոշին Մաքսիմիլյան. ԲԱՆԱՍՏԵՂԾԻ ԱՐԺԵՔ. 1. Խմբագրել բանաստեղծությունը, ինչպես արտասահմանյան ուղևորության տեքստը. Չորություն, պարզություն, ճնշում. յուրաքանչյուր բառ զգոն է:

Տառ առ տառ կտրել կոշտ ու նեղ քարի վրա. Ինչքան նոսր են բառերը, այնքան ուժեղ է նրանց ուժը: Մտքի կամային լիցքը հավասար է լուռ տողերին։

Բառարանից ջնջել «Գեղեցկություն», «Ոգեշնչում» բառերը՝ հանգերի ստոր ժարգոնը, բանաստեղծին՝ ըմբռնումներ՝ Ճշմարտություն, դիզայն, պլան, համարժեքություն, հակիրճություն և ճշգրտություն: Սթափ, ծանր արհեստի մեջ կա բանաստեղծի ոգեշնչումն ու պատիվը. սրել տրանսցենդենտալ զգոնությունը խուլ-համր հարցում: Վոլոշին Մ.Ա. Գրադարան՝ Օրյոլի տարածաշրջանային գիտական ​​ունիվերսալ հանրային գրադարան անվ. Ի.Ա. Բունինա. - Մ., ; Ընտրված գործեր՝ 2 հատորով։

Մ., ; Կարմիր ծուխ: Պատմություններ. - Մ., ; Գլադիշևը հետախուզական ընկերությունից. Պատմություններ. - Մ., ; Էշելոն; Անխուսափելիություն. Վեպեր. Կատարել է բազմաթիվ թարգմանություններ Մարիի և Ուդմուրտ բանաստեղծներից։ Ժամանակ առ ժամանակ ուժերս փորձել եմ նաև արձակում։ Op. Մաքսիմիլիան Ալեքսանդրովիչ Վոլոշինը () 20-րդ դարի առաջին երրորդի մեծագույն բանաստեղծներից է։ Նա տաղանդավոր արվեստագետ է, բազմակողմանի քնարերգու, ով անցել է սիմվոլիստական, էզոթերիկ բանաստեղծություններից մինչև քաղաքացիական-լրագրական և գիտափիլիսոփայական պոեզիա՝ մարդասիրական հակումներով՝ դեպի «Աստծո քաղաքի իդեալ»:

Առաջարկվող հրատարակությունը ընթերցողին հնարավորություն է տալիս ծանոթանալու ոչ միայն Վոլոշինի լավագույն բանաստեղծական ստեղծագործություններին, այլև նրա ամենահետաքրքիր ստեղծագործություններին գեղագիտության, հուշագրության արձակի, լրագրության և երկրների կյանքի դրամատիկ իրադարձությունների հետ կապված նամակների հետ: Հեղինակ. Վոլոշին Մաքսիմիլյան. Հեղինակի բոլոր բանաստեղծությունները: Աշխատանք. Բանաստեղծի քաջությունը. 2. Աստղեր. Ստեղծեք հեղինակների և բանաստեղծությունների սիրելի հավաքածուներ:

Զրուցեք համախոհների հետ: Գրեք ակնարկներ, մասնակցեք պոեզիայի մենամարտերին և մրցույթներին: Միացե՛ք լավագույններին: Շնորհակալություն Poembook-ին միանալու համար: Հաշվի մուտքի տվյալների հետ նամակ է ուղարկվել ձեր էլ.

Դուք պետք է մուտք գործեք 24 ժամվա ընթացքում: Հակառակ դեպքում հաշիվը կջնջվի: Գրանցված օգտվողները ստանում են բազմաթիվ առավելություններ. Հրապարակեք պոեզիա - գիտակցեք ձեր տաղանդը: Ստեղծեք հեղինակների և բանաստեղծությունների սիրելի հավաքածուներ: Զրուցեք համախոհների հետ: Գրեք ակնարկներ, մասնակցեք պոեզիայի մենամարտերին և մրցույթներին: Մաքսիմիլիան Վոլոշին. Նկարագրություն. Մաքսիմիլիան Ալեքսանդրովիչ Վոլոշինը 20-րդ դարի առաջին երրորդի մեծագույն բանաստեղծներից է։

Նա տաղանդավոր արվեստագետ է, բազմաշերտ քնարերգու, ով անցել է սիմվոլիստական, էզոթերիկ բանաստեղծություններից մինչև քաղաքացիական-լրագրական և գիտափիլիսոփայական պոեզիա՝ մարդասիրական հակումներով՝ դեպի «Աստծո քաղաքի իդեալ»: Առաջարկվող հրատարակությունը ընթերցողին հնարավորություն է տալիս ծանոթանալու ոչ միայն Վոլոշինի լավագույն բանաստեղծական ստեղծագործություններին, այլև նրա ամենահետաքրքիր ստեղծագործություններին գեղագիտության, հուշագրության արձակի, լրագրության և դրամայի հետ կապված նամակների հետ:

Ընտրված գործեր և նամակներ. Մ.Ա.Վոլոշին. Գին. շփում. Մաքսիմիլիան Ալեքսանդրովիչ Վոլոշինը 20-րդ դարի առաջին երրորդի մեծագույն բանաստեղծներից է։ Նա տաղանդավոր արվեստագետ է, բազմաշերտ քնարերգու, ով անցել է սիմվոլիստական, էզոթերիկ բանաստեղծություններից մինչև քաղաքացիական-լրագրական և գիտափիլիսոփայական պոեզիա՝ մարդասիրական հակումներով՝ դեպի «Աստծո քաղաքի իդեալ»:

Վոլոշին Մ.Ա., Բանաստեղծի քաջությունը. Ընտրված գործեր և նամակներ. շարք՝ Ռուսական դասականների նոր գրադարան. պարտադիր պատճեն Շքերթ, քաղաք, էջ, գրքի նկարագրություն: Մաքսիմիլիան Ալեքսանդրովիչ Վոլոշինը () 20-րդ դարի առաջին երրորդի մեծագույն բանաստեղծներից է։ Նա տաղանդավոր արվեստագետ է, բազմակողմանի քնարերգու, ով անցել է սիմվոլիստական, էզոթերիկ բանաստեղծություններից մինչև քաղաքացիական-լրագրական և գիտափիլիսոփայական պոեզիա՝ մարդասիրական հակումներով՝ դեպի «Աստծո քաղաքի իդեալ»:

ԿատեգորիաներԳրառման նավարկություն

Առանց լույսի աղբյուրի պատկերը տեսանելի չէ։ Աղբյուրը սկզբնավորելու և պրոցեսորին օբյեկտների վրա աղբյուրի ազդեցությունը հաշվարկելու համար, պարզապես կատարեք հրամանները՝ glEnable(gl_lighting); // միացնել լուսավորության վերլուծության ռեժիմը

GlEnable (gl_light0); // տեսարանի մեջ ներառել կոնկրետ (զրոյական) աղբյուր՝ իր բնութագրերով

Աղբյուրն անջատելու համար օգտագործեք Disable() ֆունկցիան: Լռելյայնորեն լույսի աղբյուրը գտնվում է տիեզերքում կոորդինատներով (0,0,∞): Դուք կարող եք լույսի աղբյուր ստեղծել պատկերի տարածության ցանկացած վայրում:

OpenGl գրադարանն աջակցում է չորս տեսակի լույսի աղբյուրների.

  • ֆոնային լուսավորություն (միջավայրի լուսավորություն),
  • կետային աղբյուրներ,
  • լուսարձակներ,
  • հեռավոր լույսի աղբյուրներ (հեռավոր լույս):
Յուրաքանչյուր լույսի աղբյուր ունի իր առանձնահատկությունների շարքը:
Լույսի աղբյուրի բնութագրերը համապատասխանում են Phong մոդելի պարամետրերին:
Վեկտորային պարամետրերը սահմանելու համար օգտագործեք glLightfv() ֆունկցիան, որն ունի հետևյալ ձևաչափը.

glLightfv (աղբյուր, պարամետր, ցուցիչ_դեպի_զանգված);

Կան չորս վեկտորային պարամետրեր, որոնք որոշում են աղբյուրի ճառագայթների դիրքն ու ուղղությունը և դրա բաղադրիչների գունային կազմը՝ ֆոն, ցրված և սպեկուլյար:
OpenGL-ում սկալյար պարամետրեր սահմանելու համար օգտագործեք glLightf() ֆունկցիան.

glLightf (աղբյուր, պարամետր, արժեք);

Թող, օրինակ, դուք ուզում եք տեսարանի մեջ ներառել GL_LIGHT0 աղբյուրը, որը պետք է գտնվի կետում (1.0, 2.0, 3.0): Աղբյուրի դիրքը պահպանվում է ծրագրում որպես կետ միատեսակ կոորդինատներով.

GLfloat light0_pos=(1.0, 2.0, 3.0, 1.0);

Եթե ​​այս կետի չորրորդ բաղադրիչը զրո է, ապա կետային աղբյուրը վերածվում է հեռավոր աղբյուրի, որի համար նշանակալի է միայն ճառագայթների ուղղությունը.

GLfloat light0_dir=(1.0, 2.0, 3.0, 0.0);

Այնուհետև որոշվում է աղբյուրի ֆոնի, դիֆուզիոն և սպեկուլյար բաղադրիչների գունային կազմը: Եթե ​​դիտարկվող օրինակում աղբյուրն ունի սպիտակ գույնի սպեկուլյար բաղադրիչ, իսկ ֆոնը և դիֆուզիոն բաղադրիչները պետք է կարմիր լինեն, ապա աղբյուրը ձևավորող ծրագրի հատվածն ունի հետևյալ տեսքը.

GLfloat diffise0= (1.0, 0.0, 0.0, 1.0);

GLfloat ambient0=(1.0, 0.0, 0.0, 1.0);

GLfloat specular0=(1.0, 1.0, 1.0, 1.0);

GlEnable (GL_LIGHTING);

GlEnable (GL_LIGHT0);

GlLightfv(GL_LIGHT0, GL_POSITION, light0_pos);

GlLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);

GlLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse0);

GlLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

Դուք կարող եք նաև ներառել գլոբալ ֆոնային լուսավորություն ձեր տեսարանում, որը կապված չէ որևէ առանձին լույսի աղբյուրի հետ: Եթե, օրինակ, ցանկանում եք տեսարանի բոլոր օբյեկտները մռայլորեն ընդգծել սպիտակով, ապա պետք է ծրագրում ներառեք հետևյալ կոդը.

GLfloat global_ambient=(0.1, 0.1, 0.1, 1.0);

GlLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

Լուսավորման մոդելում տերմինը, որը հաշվի է առնում աղբյուրի հեռավորությունը, ունի ձև.

K= 1/(a+ b*d+ c*d^2)

Եվ հաստատուն, գծային և քառակուսի բաղադրիչներ։ Յուրաքանչյուր աղբյուրի համար համապատասխան գործակիցները սահմանվում են անհատապես՝ օգտագործելով սկալյար պարամետրի կարգավորման ֆունկցիան, օրինակ՝

GlLightf(GL_LIGHT0, GL_CONSTANT_ATTENATION, a);

Կետային աղբյուրը լուսարձակի վերածելու համար անհրաժեշտ է նշել լուսարձակի ճառագայթի ուղղությունը (GL_SPOT_DIRECTION), ինտենսիվության բաշխման ֆունկցիայի ցուցիչը (GL_SPOT_EXPONENT) և ճառագայթի ցրման անկյունը (GL_SPOT_CUTTOF): Այս պարամետրերը սահմանվում են glLightf() և glLightfv() ֆունկցիաների միջոցով:

Լույսի աղբյուրների լռելյայն պարամետրերը ներկայացված են Աղյուսակ 3-ում:

Լույսերի լռելյայն կարգավորումներ

Աղյուսակ 3

Պարամետրի անվանումը Կանխադրված արժեք Բովանդակություն
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) շրջակա միջավայրի RGBA լույսի ինտենսիվությունը
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) լույսի ցրված RGBA ինտենսիվություն
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) Լույսի տեսողական RGBA ինտենսիվություն
GL_POSITION (0.0, 0.0, 1.0, 0.0) (x, y, z, w) լույսի դիրքը
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) (x, y, z) լուսարձակի ուղղությունը
GL_SPOT_EXPONENT 0.0 լուսարձակի ցուցիչ
GL_SPOT_CUTOFF 180.0 լուսարձակի անջատման անկյուն
GL_CONSTANT_ATTENUATION 1.0 կայուն թուլացման գործոն
GL_LINEAR_ATTENUATION 0.0 գծային թուլացման գործակից
GL_QUADRATIC_ATTENUATION 0.0 քառակուսի թուլացման գործոն