ู‚ู„ูŠู„ุง ุนู† ุงู„ุชุธู„ูŠู„ ููˆู†ุฌ


"ู„ุง ูŠู…ูƒู†ู†ุง ุฃู† ู†ุชูˆู‚ุน ุฃู†ู†ุง ุณู†ูƒูˆู† ู‚ุงุฏุฑูŠู† ุนู„ู‰ ุนุฑุถ ุงู„ูƒุงุฆู† ูƒู…ุง ู‡ูˆ ููŠ ุงู„ูˆุงู‚ุน ุŒ ู…ุน ุงู„ู‚ูˆุงู… ุŒ ูˆุงู„ุธู„ุงู„ ุŒ ุฅู„ุฎ. ู†ุฃู…ู„ ูู‚ุท ููŠ ุฅู†ุดุงุก ุตูˆุฑุฉ ู‚ุฑูŠุจุฉ ุจุฏุฑุฌุฉ ูƒุงููŠุฉ ู„ุชุญู‚ูŠู‚ ุฏุฑุฌุฉ ู…ุนูŠู†ุฉ ู…ู† ุงู„ูˆุงู‚ุนูŠุฉ ".

ุจูˆูŠ ุชุงูŠูˆู†ุฌ ููˆู†ุฌ

ูˆู„ุฏ ุจูˆูŠ ุซูˆู†ุฌ ููˆู†ุฌ ููŠ ุนุงู… 1941 ูˆุฃุตุจุญ ุนุงู„ู… ุงู„ูƒู…ุจูŠูˆุชุฑ ุฎู„ุงู„ ุญุฑุจ ููŠุชู†ุงู…. ูŠุฌุจ ุฃู† ูŠูƒูˆู† ู…ู† ุงู„ุตุนุจ ุนู„ูŠู‡ ุฅูƒู…ุงู„ ุฏุฑุงุณุงุชู‡ ููŠ ุงู„ุจูŠุฆุฉ ุงู„ุณุงู…ุฉ ููŠ ุงู„ุณุชูŠู†ูŠุงุช ุŒ ู†ุงู‡ูŠูƒ ุนู† ุญู‚ูŠู‚ุฉ ุฃู†ู‡ ุชู… ุงุณุชุฏุนุงุคู‡ ุฅู„ู‰ ุงู„ุฃู…ุงู…! ู„ูƒู†ู‡ ุชู…ูƒู† ู…ู† ุงู„ุจู‚ุงุก ุนู„ู‰ ู‚ูŠุฏ ุงู„ุญูŠุงุฉ ูˆุงู„ุจู‚ุงุก ุนู„ู‰ ู‚ูŠุฏ ุงู„ุญูŠุงุฉ ุญุชู‰ ุนุงู… 1975 ุŒ ู‚ุจู„ ุฃู† ูŠู‚ุชู„ ุณุฑุทุงู† ุงู„ุฏู… ุญูŠุงุชู‡ ุจุนุฏ ุนุงู…ูŠู† ูู‚ุท ู…ู† ุฅุฑุณุงุก ุงู„ุฃุณุงุณ ู„ุนุงู„ู… ุงู„ู†ุธุฑูŠุฉ ุงู„ุญุฏูŠุซุฉ ู„ู„ุฅุถุงุกุฉ ูˆุงู„ุชุธู„ูŠู„: Fong's shader . ุชุชูƒูˆู† ุงู„ุฃุณู…ุงุก ุงู„ููŠุชู†ุงู…ูŠุฉ ู…ู† ุซู„ุงุซุฉ ุฃุฌุฒุงุก: ุงู„ู„ู‚ุจ ูˆุงู„ุงุณู… ุงู„ุฃูˆุณุท ูˆุงู„ุงุณู… ุงู„ุดุฎุตูŠ. ุฃูŠ ุนู†ุฏู…ุง ูŠู‚ูˆู„ ุงู„ู†ุงุณ "Fong shader" ุŒ ูŠุณู…ูˆู† ุงู„ุงุณู… ุงู„ุดุฎุตูŠ Bui Tyong. ูŠู…ูƒู†ูƒ ู‚ุฑุงุกุฉ ุงู„ู…ุฒูŠุฏ ุนู† ุงู„ุฃุณู…ุงุก ุงู„ุดุฎุตูŠุฉ ุนู„ู‰ ูˆูŠูƒูŠุจูŠุฏูŠุง .


ู„ุณุช ู…ุชุฃูƒุฏู‹ุง ู…ู…ุง ุฅุฐุง ูƒุงู† ู‡ุฐุง ู‡ูˆ Phong ุŒ ู„ูƒู† ูˆูู‚ู‹ุง ู„ู€ Google ุŒ ู†ุนู….

"ุฏุน ุจู‡ุฏูˆุก ุฃุดุนุฉ ุงู„ุดู…ุณ ุงู„ู‡ุงุฏุฆุฉ
ุงู„ุนุจ ุญูˆู„ ุณุฑูŠุฑูŠ ุงู„ู…ุญุชุถุฑ
E'er ูˆุงุฏูŠ ู…ุถุงุกุฉ ุจุดูƒู„ ุฎุงูุช
ุฃู†ุง ู…ุน ุงู„ู‚ุฏู…ูŠู† ูˆุญูŠุฏุง ูŠุฌุจ ุฃู† ูู‚ูŠ. "

ุฏุน ุงู„ู†ูˆุฑ ูŠุฏุฎู„ - ู‚ุตูŠุฏุฉ ุจู‚ู„ู… ูุฑุงู†ุณูŠุณ ู‡ุงุฑุจุฑ

ูˆูŠุณุชู†ุฏ ุชุธู„ูŠู„ ููˆู†ุฌ ุนู„ู‰ ุงู„ุฑูŠุงุถูŠุงุช ู…ูˆุฌุฒุฉ ู„ู„ุบุงูŠุฉ. ูˆู‡ูˆ ุŒ ููŠ ุงู„ูˆุงู‚ุน ุŒ ู„ุง ุชุญุชุงุฌ ุฅู„ู‰ ู…ุนุฑูุชู‡ ุŒ ุฅู„ุง ุฅุฐุง ูƒู†ุช ุชุฑุบุจ ุจุฅุฎู„ุงุต ููŠ ุฃู† ุชุตุจุญ ู…ุจุฑู…ุฌ ุฑุณูˆู…ุงุช. ูˆู…ุน ุฐู„ูƒ ุŒ ุนู„ู‰ ุงู„ู…ุฏู‰ ุงู„ุทูˆูŠู„ ุŒ ูุฅู† ู…ุนุฑูุชู‡ุง ุณุชูƒูˆู† ู…ููŠุฏุฉ. ููŠู…ุง ูŠู„ูŠ ู…ู‚ุชุทูุงุช ู…ู† ุจุฑู†ุงู…ุฌ OpenGL Superbible ุŒ ุงู„ุฅุตุฏุงุฑ ุงู„ุณุงุจุน ู…ู† ู‚ูุจู„ Graham Sellers ูˆู…ุคุณุณุฉ Kronos Group ARB.

ุฃ) ุจุนุถ ุงู„ู…ูุงู‡ูŠู…


ุฃูˆู„ุงู‹ ุŒ ุฏุนูˆู†ุง ู†ุชุนุฑู ุนู„ู‰ ุงู„ู…ูุงู‡ูŠู…. ุฅุฐุง ูƒู†ุช ุชุชุนุงู…ู„ ู…ุน ุงู„ู†ู…ุฐุฌุฉ ุซู„ุงุซูŠุฉ ุงู„ุฃุจุนุงุฏ ุฃูˆ ุชุทูˆูŠุฑ ุงู„ู„ุนุจุฉ ู„ู…ุฏุฉ ุฏู‚ูŠู‚ุฉ ุนู„ู‰ ุงู„ุฃู‚ู„ ุŒ ููŠุฌุจ ุฃู† ุชูƒูˆู† ู‚ุฏ ูˆุงุฌู‡ุชู‡ุง ุจุงู„ูุนู„ ุŒ ู„ูƒู† ุงู„ุชูƒุฑุงุฑ ู„ู… ูŠุฒุนุฌ ุฃูŠ ุดุฎุต.

A-1) ุงู„ุถูˆุก ุงู„ู…ุญูŠุท

ุชู‚ุงุฑู† ู…ุนุธู… ุงู„ูƒุชุจ ุŒ ุฎุงุตุฉ ุชู„ูƒ ุฐุงุช ุงู„ุฌูˆุฏุฉ ุงู„ู…ู†ุฎูุถุฉ ุŒ ู‡ุฐู‡ ุงู„ุฅุถุงุกุฉ ุจุฃุดุนุฉ ุงู„ุดู…ุณ ุŒ ู„ูƒู† ู‡ุฐุง ุบูŠุฑ ุตุญูŠุญ ุชู…ุงู…ู‹ุง. ุงู„ุฅุถุงุกุฉ ุงู„ู…ุญูŠุทุฉ ู„ูŠุณุช ุถูˆุก ุงู„ุดู…ุณ. ุฅู†ู‡ ูŠุฃุชูŠ ู…ู† ุฌู…ูŠุน ุงู„ุงุชุฌุงู‡ุงุช ุŒ ุฃูŠ ุฃู†ู‡ ู…ูˆุฌูˆุฏ ููŠ ูƒู„ ู…ูƒุงู† ุŒ ู„ูƒู†ู‡ ููŠ ุงู„ุญุณุงุจุงุช ุนุจุงุฑุฉ ุนู† ู†ุงู‚ู„ ุฐูˆ ุซู„ุงุซุฉ ู…ูƒูˆู†ุงุช. ููŠ ุชุธู„ูŠู„ ููˆู†ุฌ ุŒ ูŠุชู… ุฅุถุงูุชู‡ ููŠ ุงู„ู†ู‡ุงูŠุฉ ุŒ ู„ูƒู†ู‡ ู„ุง ูŠุชุบูŠุฑ.

A-2) ู…ู†ุชุดุฑ / ู…ู†ุชุดุฑ ุงู„ุถูˆุก

ุงู„ุฅุถุงุกุฉ ุงู„ู…ู†ุชุดุฑุฉ ู„ู‡ุง ุงุชุฌุงู‡. ู‡ุฐุง ู‡ูˆ ููŠ ุงู„ูˆุงู‚ุน ู…ูƒูˆู† ุงุชุฌุงู‡ูŠ ู„ู…ุตุฏุฑ ุงู„ุถูˆุก [ูƒุฐุง] . ููŠ ุงู„ุณูŠู†ู…ุง ุŒ ูŠู†ุชุดุฑ ุงู„ุถูˆุก ุจุงุณุชุฎุฏุงู… ุตู†ุฏูˆู‚ ู†ุงุนู… ุŒ ูˆููŠ ุฑุณูˆู…ุงุช ุงู„ุญุงุณูˆุจ ุŒ ูŠู†ุชุดุฑ ุงู„ุถูˆุก ุจุงุณุชุฎุฏุงู… ุตูŠุบุฉ ู†ุนุฑุถู‡ุง ุฃุฏู†ุงู‡. ุงู„ุญุฌู… ุŒ ุฃูŠ ุญุฌู… ุงู„ุฅุถุงุกุฉ ุงู„ู…ู†ุชุดุฑุฉ ุŒ ูŠุนุชู…ุฏ ุนู„ู‰ ุงู„ุณุทุญ. ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุฅุฐุง ูƒุงู† ุงู„ุณุทุญ ุบูŠุฑ ู„ุงู…ุน ุŒ ุฃูŠ ุฃู†ู‡ ูŠู…ุชุต ุฃูƒุซุฑ ู…ู…ุง ูŠุนูƒุณ ุงู„ุถูˆุก ุŒ ูุฅู† ุงู„ู‚ูŠู…ุฉ ุณุชูƒูˆู† ุฃูƒุจุฑ ู…ู† ุญุงู„ุฉ ุงู„ุณุทุญ ุงู„ุฃู…ู„ุณ.


ุถูˆุก ู…ุญูŠุท ู…ุจุนุซุฑ / ู…ู…ุชุต ู…ู† ุดุงุดุฉ ุจู„ูˆุฑูŠุฉ

A-3) ุชุณู„ูŠุท ุงู„ุถูˆุก ุนู„ู‰ ุจุฑุงู‚

ู…ุซู„ ุงู„ุฅุถุงุกุฉ ุงู„ู…ู†ุชุดุฑุฉ ุŒ ูŠูƒูˆู† ุงู„ุถูˆุก ุงู„ู…ู†ุนูƒุณ ุงุชุฌุงู‡ูŠ ุŒ ูˆู„ูƒู†ู‡ ูŠุนุชู…ุฏ ุนู„ู‰ ู„ู…ุนุงู† ุงู„ุณุทุญ ุ› ูุฅู†ู‡ ูŠุชุฑูƒ ุชุณู„ูŠุท ุงู„ุถูˆุก ูŠุณู…ู‰ ุจุฑูŠู‚ . ููŠ ุงู„ุญูŠุงุฉ ุงู„ุญู‚ูŠู‚ูŠุฉ ุŒ ุงู„ู„ู…ุนุงู† ู„ูŠุณ ุฌุฒุกู‹ุง ู„ุง ูŠุชุฌุฒุฃ ู…ู† ุงู„ู…ุงุฏุฉ. ููŠ ุงู„ูˆุงู‚ุน ุŒ ูุฅู† ุทู„ุงุก ุงู„ููŠู„ู… ุฃูˆ ู‚ุทุฑุฉ ู…ู† ุงู„ุดู…ุน ุณุชุถูŠู ุงู„ูƒุซูŠุฑ ุฅู„ู‰ ุงู„ู„ู…ุนุงู† ุฃูƒุซุฑ ู…ู† ุฃูŠ ุดูŠุก ุขุฎุฑ. ุงู„ู„ู…ุนุงู† ุงู„ู…ู†ุนูƒุณ ู‡ูˆ ุนุงู…ู„ ูŠุชุฑุงูˆุญ ู…ู† 0 ุฅู„ู‰ 128 ุŒ ู„ุฃู†ู‡ ุนู†ุฏ ุงู„ู‚ูŠู… ุฃุนู„ู‰ ู…ู† 128 ู„ู† ูŠุคุซุฑ ุจุดูƒู„ ูƒุจูŠุฑ ุนู„ู‰ ุงู„ุชุธู„ูŠู„.


ููŠู„ู… ู…ุน ููŠู„ู… - ูˆุฑู‚ ุณู…ูŠูƒ ู…ู„ูˆู† ู…ุน ุทุจู‚ุฉ ุทู„ุงุก ู„ุงู…ุนุฉ ุŒ ู‡ุฏูŠุฉ ุญู‚ูŠู‚ูŠุฉ ู„ู„ุทูู„.

4 - ุงู„ุจูŠุฏูˆ

ู‡ุฐุง ู‡ูˆ ุฌุฒุก ู…ู† ุงู„ุถูˆุก ุงู„ุญุงุฏุซ ูŠู†ุนูƒุณ ุนู„ู‰ ุงู„ุณุทุญ.

A-5) ุตูŠุบุฉ ููˆู†ุฌ

ุงู„ุตูŠุบุฉ ู„ุญุณุงุจ ุงู„ู…ูˆุงุฏ ูˆูู‚ุง ู„ููˆู†ุฌ ู‡ูŠ ูƒู…ุง ูŠู„ูŠ:

Ip=kaia+kd left( vecL. VecN right)id+ks left( vecR. VecV right) alphais


ุญูŠุซ:

ka: ุงู„ู…ูˆุงุฏ ุงู„ู…ุญูŠุทุฉ

kd: ู†ุดุฑ ุงู„ู…ูˆุงุฏ

ks: ุงู„ู…ูˆุงุฏ ุจุฑุงู‚ ูˆ  alpha: ู‚ูŠู…ุฉ ุงู„ู„ู…ุนุงู†

ia: ุงู„ุฅุถุงุกุฉ ุงู„ู…ุญูŠุทุฉ

id: ุฅุถุงุกุฉ ู…ู†ุชุดุฑุฉ

is: ุฅุถุงุกุฉ ุบูŠุฑ ู…ุจุงุดุฑุฉ

ู‚ุฏ ุชุณุฃู„ ุŒ ู…ุงุฐุง ุนู† ุงู„ู…ุชุฌู‡ุงุชุŸ ู„ุง ุชู‚ู„ู‚ ุŒ ุงู„ุขู† ุณู†ุฎุจุฑู‡ู…:

 vecN: ุทุจูŠุนูŠ ุนู„ู‰ ุงู„ุณุทุญ

 vecL: ู…ุชุฌู‡ ุงู„ูˆุญุฏุฉ ู…ู† ุงู„ู†ู‚ุทุฉ ุงู„ู…ุธู„ู„ุฉ ุฅู„ู‰ ู…ุตุฏุฑ ุงู„ุถูˆุก (ุจู…ุนู†ู‰ ุขุฎุฑ ุŒ ู…ุชุฌู‡ ุงู„ุถูˆุก)

 vecR: ุงู†ุนูƒุงุณ ุงู„ู‚ูŠู…ุฉ ุงู„ุณู„ุจูŠุฉ ู„ู…ุชุฌู‡ ุงู„ุถูˆุก

 overrightarrowV: ู†ุงู‚ู„ุงุช ู…ูˆุฌู‡ุฉ ู†ุญูˆ ุงู„ู…ุดุงู‡ุฏ


ุจ) ุชุธู„ูŠู„ ุฌูˆุฑูˆ


ู‚ุจู„ ุงู„ุดุฑูˆุน ููŠ ุชุธู„ูŠู„ Fong ุŒ ุฏุนูˆู†ุง ู†ุฑู‰ ูƒูŠู ูŠู…ูƒู†ูƒ ุงู„ุญุตูˆู„ ุนู„ู‰ ุชุธู„ูŠู„ Gouro ุนู„ู‰ GLSL. ูŠุฑุฌู‰ ู…ู„ุงุญุธุฉ ุฃู†ู†ูŠ ุฃุณุชุฎุฏู… ุงู„ุฅุตุฏุงุฑ GLSL 4.1 ุŒ ูƒู…ุง ููŠ Superbible ุŒ ูˆู„ูƒู† ุฅุฐุง ูƒู†ุช ู…ู† ู…ุญุจูŠ www.learnopengl.com ุŒ ููŠู…ูƒู†ูƒ ุงุณุชุฎุฏุงู… 3.3. ู„ุง ูŠู‡ู… ู„ุฐู„ูƒ ุŒ ุฏุนูˆู†ุง ู†ุฑู‰ ู…ุง ู‡ูˆ ุงู„ุชุธู„ูŠู„ Gouraud.

ุงุฎุชุฑุน ุทุฑูŠู‚ุฉ ุงู„ุชุธู„ูŠู„ ู‡ุฐู‡ ุจูˆุงุณุทุฉ ู‡ู†ุฑูŠ ุบูˆุฑูˆ ููŠ ุนุงู… 1971. ู„ุง ูŠุชุฌุงูˆุฒ ุงู„ุชุธู„ูŠู„ Phong ุจุฃูŠ ุดูƒู„ ู…ู† ุงู„ุฃุดูƒุงู„ ุŒ ูˆุงู„ูŠูˆู… ูŠุณุชุฎุฏู… ุจุดูƒู„ ุฑุฆูŠุณูŠ ูƒุทุฑูŠู‚ุฉ ู„ู…ุนุงูŠู†ุฉ ุงู„ุชุญู…ูŠู„ ุจุฏูˆู† GPU ููŠ ุญุฒู… ู…ุซู„ Cinema 4D. ู…ุดูƒู„ุชู‡ ู‡ูŠ ุฃู† ุงู„ุชูˆู‡ุฌ ุงู„ุฐูŠ ูŠูˆู„ุฏู‡ ูŠุดุจู‡ ุงู„ุดุฑุงุฑุฉ:


ุณุจุจ ู‡ุฐู‡ ุงู„ู…ุดูƒู„ุฉ ู‡ูˆ ุงุณุชูŠูุงุก ุงู„ุฃู„ูˆุงู† ุจูŠู† ุงู„ู‚ู…ู… ุŒ ูˆุชุญุฏุซ ุงู„ุซุบุฑุงุช ุจูŠู† ุงู„ู…ุซู„ุซุงุช ุจุณุจุจ ุชุญุฑูŠู ุงู„ุฃู„ูˆุงู† ุฎุทูŠู‹ุง. ุชู… ุญู„ ู‡ุฐู‡ ุงู„ู…ุดูƒู„ุฉ ูู‚ุท ููŠ Phong shader. ุฏุนูˆู†ุง ู†ุฑู‰ ูƒูŠู ูŠู…ูƒู†ูƒ ุชุทุจูŠู‚ ุชุธู„ูŠู„ Gouro ุนู„ู‰ GLSL 4.1.

ู‚ุงุฆู…ุฉ 1 : Gourox ู‚ู…ุฉ ุงู„ุชุธู„ูŠู„ ุนู„ู‰ GLSL 4.1

#version 410 core // Per-vertex inputs layout (location = 0) in vec4 position; layout (location = 1) in vec3 normal; // Matrices we'll need layout (std140) uniform constants { mat4 mv_matrix; mat4 view_matrix; mat4 proj_matrix; }; // Light and material properties uniform vec3 light_pos = vec3(100.0, 100.0, 100.0); uniform vec3 diffuse_albedo = vec3(0.5, 0.2, 0.7); uniform vec3 specular_albedo = vec3(0.7); uniform float specular_power = 128.0; uniform vec3 ambient = vec3(0.1, 0.1, 0.1); // Outputs to the fragment shader out VS_OUT { vec3 color; } vs_out; void main(void) { // Calculate view-space coordinate vec4 P = mv_matrix * position; // Calculate normal in view space vec3 N = mat3(mv_matrix) * normal; // Calculate view-space light vector vec3 L = light_pos - P.xyz; // Calculate view vector (simply the negative of the view-space position) vec3 V = -P.xyz; // Normalize all three vectors N = normalize(N); L = normalize(L); V = normalize(V); // Calculate R by reflecting -L around the plane defined by N vec3 R = reflect(-L, N); // Calculate the diffuse and specular contributions vec3 diffuse = max(dot(N, L), 0.0) * diffuse_albedo; vec3 specular = pow(max(dot(R, V), 0.0), specular_power) * specular_albedo; // Send the color output to the fragment shader vs_out.color = ambient + diffuse + specular; // Calculate the clip-space position of each vertex gl_Position = proj_matrix * P; } 

ูˆุงู„ุขู† ุดุธูŠุฉ ุดุธูŠุฉ.

ู‚ุงุฆู…ุฉ 2: ุดุธูŠุฉ ุดุธูŠุฉ ู…ู† ู†ูุณ ุงู„ู…ูู‡ูˆู….

 #version 410 core // Output layout (location = 0) out vec4 color; // Input from vertex shader in VS_OUT { vec3 color; } fs_in; void main(void) { // Write incoming color to the framebuffer color = vec4(fs_in.color, 1.0); } 

ุฌ) ุชุธู„ูŠู„ ููˆู†ุฌ


ู‚ุจู„ ุงู„ุงู†ุชู‚ุงู„ ุŒ ุฏุนู†ุง ู†ุชุฐูƒุฑ ุฃู† ุฅุถุงุกุฉ ุงู„ุชุธู„ูŠู„ Phong ูˆ Phong ู‡ู…ุง ู…ูู‡ูˆู…ุงู† ู…ุฎุชู„ูุงู†. ูŠู…ูƒู†ูƒ ุงู„ุชุฎู„ุต ู…ู† "ู†ุฏูุฉ ุงู„ุซู„ุฌ" ู…ู† ู…ุถูŠุฆุฉ Guro ุจุฅุถุงูุฉ ุงู„ู…ุฒูŠุฏ ู…ู† ุงู„ู‚ู…ู… ุŒ ู„ูƒู† ู„ู…ุงุฐุง ุฅุฐุง ูƒุงู† ู„ุฏูŠู†ุง ุชุธู„ูŠู„ ููŠ FongุŸ ููŠ ุชุธู„ูŠู„ Phong ุŒ ู„ุง ูŠุชู… ุชุญุฑูŠู ุงู„ู„ูˆู† ุจูŠู† ุงู„ุฑุคูˆุณ (ูƒู…ุง ู‡ูˆ ู…ูˆุถุญ ููŠ ุงู„ู‚ุงุฆู…ุฉ 1 ูˆ 2) ุŒ ูู†ุญู† ุฃู‚ุญู…ู†ุง ุจูŠู† ุงู„ุฑุคูˆุณ ุงู„ุนุงุฏูŠุฉ ู„ู„ุณุทุญ ุŒ ูˆู†ุณุชุฎุฏู… ุงู„ู…ุนุฏู„ ุงู„ุทุจูŠุนูŠ ุงู„ุฐูŠ ุชู… ุฅู†ุดุงุคู‡ ู„ุฅุฌุฑุงุก ุฌู…ูŠุน ุญุณุงุจุงุช ุงู„ุฅุถุงุกุฉ ู„ูƒู„ ุจูƒุณู„ ุŒ ูˆู„ูŠุณ ุงู„ุฑุคูˆุณ. ูˆู…ุน ุฐู„ูƒ ุŒ ูุฅู† ู‡ุฐุง ูŠุนู†ูŠ ุฃู† ุชุธู„ูŠู„ ุงู„ุดุธุงูŠุง ุณูŠุชุนูŠู† ุนู„ูŠู‡ ุงู„ู‚ูŠุงู… ุจุงู„ู…ุฒูŠุฏ ู…ู† ุงู„ุนู…ู„ ุŒ ูƒู…ุง ู‡ูˆ ู…ูˆุถุญ ููŠ ุงู„ู‚ุงุฆู…ุฉ 4. ู„ูƒู† ุฃูˆู„ุงู‹ ุŒ ุฏุนูˆู†ุง ู†ู†ุธุฑ ุฅู„ู‰ ุชุธู„ูŠู„ ู‚ู…ุฉ ุงู„ุฑุฃุณ.


ู‚ุงุฆู…ุฉ 3: ุชุธู„ูŠู„ ู‚ู…ุฉ ุงู„ุฑุฃุณ ู„ุชุธู„ูŠู„ ููˆู†ุฌ ุนู„ู‰ GLSL 4.1.

 #version 410 core // Per-vertex inputs layout (location = 0) in vec4 position; layout (location = 1) in vec3 normal; // Matrices we'll need layout (std140) uniform constants { mat4 mv_matrix; mat4 view_matrix; mat4 proj_matrix; }; // Inputs from vertex shader out VS_OUT { vec3 N; vec3 L; vec3 V; } vs_out; // Position of light uniform vec3 light_pos = vec3(100.0, 100.0, 100.0); void main(void) { // Calculate view-space coordinate vec4 P = mv_matrix * position; // Calculate normal in view-space vs_out.N = mat3(mv_matrix) * normal; // Calculate light vector vs_out.L = light_pos - P.xyz; // Calculate view vector vs_out.V = -P.xyz; // Calculate the clip-space position of each vertex gl_Position = proj_matrix * P; } 

ู„ู… ูŠุชุบูŠุฑ ุดูŠุก ุชู‚ุฑูŠุจุง. ู„ูƒู† ููŠ ุธู„ ุงู„ุชุธู„ูŠู„ ุŒ ุงู„ูˆุถุน ู…ุฎุชู„ู ุชู…ุงู…ู‹ุง.

ู‚ุงุฆู…ุฉ 4: ููˆู†ุบ ุดุงุฏุฑ ุดุงุฏุฑ ุดุงุฏุฑ.

 #version 410 core // Output layout (location = 0) out vec4 color; // Input from vertex shader in VS_OUT { vec3 N; vec3 L; vec3 V; } fs_in; // Material properties uniform vec3 diffuse_albedo = vec3(0.5, 0.2, 0.7); uniform vec3 specular_albedo = vec3(0.7); uniform float specular_power = 128.0; uniform vec3 ambient = vec3(0.1, 0.1, 0.1); void main(void) { // Normalize the incoming N, L and V vectors vec3 N = normalize(fs_in.N); vec3 L = normalize(fs_in.L); vec3 V = normalize(fs_in.V); // Calculate R locally vec3 R = reflect(-L, N); // Compute the diffuse and specular components for each fragment vec3 diffuse = max(dot(N, L), 0.0) * diffuse_albedo; vec3 specular = pow(max(dot(R, V), 0.0), specular_power) * specular_albedo; // Write final color to the framebuffer color = vec4(ambient + diffuse + specular, 1.0); } 

ุญุณู†ู‹ุง ุŒ ู‡ุฐู‡ ู‡ูŠ ู†ู‡ุงูŠุฉ ุงู„ู…ู‚ุงู„ ุŒ ุฃุชู…ู†ู‰ ุฃู† ุชุณุชู…ุชุนูˆุง ุจู‡. ุฅุฐุง ูƒุงู† ุฐู„ูƒ ู‚ุฏ ุฃุซุงุฑ ุดุฑุงุฑุฉ ุงู‡ุชู…ุงู… OpenGL ููŠูƒ ุŒ ููŠู…ูƒู†ูƒ ุดุฑุงุก OpenGL Superbible ู…ู† Amazon ุฃูˆ ุงุณุชูƒุดุงู learnopengl.com. ุฅุฐุง ู„ู… ุชุชู…ูƒู† ู…ู† ุงู„ุชุนุงู…ู„ ู…ุน ุชุธู„ูŠู„ ุŒ ูุฅู†ู†ูŠ ุฃูˆุตูŠ ุจู€ Book of Shaders .

Source: https://habr.com/ru/post/ar441862/


All Articles