рд╕рд╛рдЗрдХрд┐рд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд▓рд╛ рдЦрд┐рд▓реМрдиреЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреАред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ
рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдорд╛рддреНрд░рд╛ рдпрд╛ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ ред

рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рджреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: 2 рдбреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рдХрд╛рд╢ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рд░реВрдкред
рдкреНрд░рдХрд╛рд╢
рдХрд╡рд░реЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦрд╛ рддреЛ рдореИрдВ рднреА рд╣реИрд░рд╛рди рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрд╕реА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдмреЗрд╢рдХ, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░рдг рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд▓рд╛ рдореЗрдВ рдХрд╛рдлреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛ рд╣реИ, рдореИрдВ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдкреНрд░рдХрд╛рд╢ рдХреА рддреАрд╡реНрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рджрд░рдЕрд╕рд▓, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЬрд╣рд╛рдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХрд╛) рдФрд░ рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХрд╛ рдкрд┐рдХреНрд╕реЗрд▓
рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдКрдкрд░ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ), рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реВрдВ:
рд╕реНрдкреНрд░рд╛рдЗрдЯ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЕрдЧрд▓рд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдКрдВрдЪрд╛рдИ рдХрд╛ рдирдХреНрд╢рд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдПрдХ рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХреНрд╢реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдПрдХ рдКрдВрдЪрд╛рдИ рдХрд╛ рдирдХреНрд╢рд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрдХреНрдХрд░ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк
рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдКрдВрдЪрд╛рдИ рдХреЗ рдирдХреНрд╢реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдореИрдВрдиреЗ GIMP рдХреЗ рд▓рд┐рдП
рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ (рдпрд╣рд╛рдВ
рдХреБрдЫ рдЕрдЪреНрдЫреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ
рдСрдмрдВрдЯреНрд╕ рд╣реИрдВ)ред

рддреЛ, рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рд╣реИрдВред рдПрдХ рдЫрд╛рдпрд╛рджрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЗрди рджреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рджрд┐рд╢рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рддреАрд╡реНрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдореЗрд░реА
рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИред
рдХреЛрдб// varying vec4 texCoord; void main(){ gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; texCoord = gl_MultiTexCoord0; } // uniform sampler2D colorMap; uniform sampler2D normalMap; varying vec4 texCoord; uniform vec2 light; uniform vec2 screen; uniform float dist; void main() { vec3 normal = texture2D(normalMap, texCoord.st).rgb; normal = 2.0*normal-1.0; vec3 n = normalize(normal); vec3 l = normalize(vec3((gl_FragCoord.xy-light.xy)/screen, dist)); float a = dot(n, l); gl_FragColor = a*texture2D(colorMap, texCoord.st); }
рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд
рдпрд╣ рддрдХрдиреАрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫрд╛рдпрд╛рдВрдХрди рдХреА рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреА рд╣реИред
рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд╢ рдмрдлрд░ рдмрдирд╛рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдлреНрд░реЗрдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢ рдХреА рддреАрд╡реНрд░рддрд╛ рдХрд╛ рдореВрд▓реНрдп рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ 2D рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд
рд▓рд╛рдЗрдЯрдореИрдк рд╣реИ ред
рдПрдХ рд▓рд╛рдЗрдЯрдореИрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн:
- рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗрд╡рд▓ рд▓реЛрд╣реЗ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1000 рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд 1000 рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╣реИрдВред 1000 рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рдирд╛ рдореЛрдмрд╛рдЗрд▓ GPU рдХреЗ рд▓рд┐рдП рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдХреНрдпрд╛ рдХрд┐рд╕реА 2D рджреГрд╢реНрдп рдореЗрдВ 1000 рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?
- рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧреЛрдВ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдбрд┐рдЧреНрд░реА рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рд╡рдЯ рд╣реИ
- рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рджреГрд╢реНрдп рдХрд╛ рдПрдХ рд▓рд╛рдЗрдЯрдореИрдк:

рдпрд╣ рдПрдХ рдирдИ рдкреНрд░рдХрд╛рд╢ рддрдХрдиреАрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЛрдг рд╣реИ - рдПрдХ рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреА рдХрдореАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЧреБрдг рдХреНрдпрд╛ рд╣реИрдВред рдореИрдВ рднреМрддрд┐рдХреА рдкрд░ рдПрдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рд╕реЗ рдЬрдЯрд┐рд▓ рд╕реВрддреНрд░ рдФрд░ рдЙрджреНрдзрд░рдг рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдпрд╣ рд╕рдм рдЙрдмрд╛рдК рд╣реИ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЕрдкрдиреА рдорд╛рдБ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред
рддреЛ рдЖрдЧреЗ рдкреНрд░рдХрд╛рд╢ рдХреА рдХрд┐рд░рдгреЗрдВ рдирд┐рдХрд▓рддреА рд╣реИрдВ, рдЙрдирдХреА рддреАрд╡реНрд░рддрд╛ рдХрдордЬреЛрд░ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдЕрд╡рд▓реЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд╢ рдХрд┐рд░рдгреЛрдВ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкрдбрд╝реЛрд╕реА рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдорд╛рди 0.5 рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ 0.25 рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рдХрд┐рд░рдг рдХрд╛ рд╡реЗрдХреНрдЯрд░ рдкрд╣рд▓реЗ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рджреВрд╕рд░реЗ рддрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реЛрд╢рдиреА рдХреЗ рд╕рджрд┐рд╢ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реВрддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
v [cx] [cy] .x = p [cx] [cy] .x - p [cx + 1] [cyx .x
v [cx] [cy] .y = p [cx] [cy] .y - p [cx] [+ + 1] .y
рдЬрд╣рд╛рдВ cx, рд╕рд╛рдЗрдмрд░ рдкреНрд░рд╢реНрди рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рдЖрд╕рдиреНрди рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдмреЗрд╣рдж рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рдХреА рд▓рдВрдмрд╛рдИ рднреА рдЫреЛрдЯреА рдФрд░ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ "рдлреНрд▓реИрдЯ" рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓реЗ: рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдпрд╛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ 1 рдпрд╛ рдЕрдзрд┐рдХ рдкрд┐рдХреНрд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рд▓реЗрдВред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░рдХрд╛рд╢ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЗрди рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдВрддрд┐рдо рд╕реВрддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
v [cx] [cy] .x = (p [cx-d / 2] [cy] .x - p [cx + d / 2] [cy] .x) * k
v [cx] [cy] .y = (p [cx] [cy-d / 2] .y - p [cx] [cy + d / 2] .y) * k
рдЬрд╣рд╛рдВ k рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╕рджрд┐рд╢ рдХрд╛ рд▓рд╛рдн рд╣реИ, d рдЙрд╕ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджрд┐рд╢рд╛ рд╕рджрд┐рд╢ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрди рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдпрд╛ рддреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд╢ рдорд╛рдирджрдВрдб рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдлреНрд░реЗрдо рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдордХреНрдЦреА рдкрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред
рд╢реЗрдбрд░ // varying vec4 texCoord; varying vec4 nmTexCoord; varying vec2 lightMapTexCoord; // varying vec2 lightMapTexCoordX1; // varying vec2 lightMapTexCoordX2; // varying vec2 lightMapTexCoordY1; // varying vec2 lightMapTexCoordY2; // //, , . uniform vec2 fieldSize; // const float spriteSize = 16.0; // void main() { gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; texCoord = gl_MultiTexCoord0; nmTexCoord = gl_MultiTexCoord1; // . lightMapTexCoordX1 = vec2(gl_Vertex.x/(fieldSize.x-1.0/spriteSize), gl_Vertex.y/fieldSize.y); lightMapTexCoordX2 = vec2(gl_Vertex.x/(fieldSize.x+1.0/spriteSize), gl_Vertex.y/fieldSize.y); lightMapTexCoordY1 = vec2(gl_Vertex.x/fieldSize.x, gl_Vertex.y/(fieldSize.y-1.0/spriteSize)); lightMapTexCoordY2 = vec2(gl_Vertex.x/fieldSize.x, gl_Vertex.y/(fieldSize.y+1.0/spriteSize)); lightMapTexCoord = vec2(gl_Vertex.x/fieldSize.x, gl_Vertex.y/fieldSize.y); } //--------------------------------------------------------------------------------------------------------------- // varying vec4 texCoord; varying vec4 nmTexCoord; varying vec2 lightMapTexCoord; varying vec2 lightMapTexCoordX1; varying vec2 lightMapTexCoordX2; varying vec2 lightMapTexCoordY1; varying vec2 lightMapTexCoordY2; uniform sampler2D colorMap; // uniform sampler2D lightMap; uniform float ambientIntensity; // uniform float lightIntensity; // const float shadowIntensity = 8.0; // const vec3 av = vec3(0.33333); // void main() { vec4 lmc = texture2D(lightMap, lightMapTexCoord)*2,0; // . , 0.5, 1.0 (). , , . , . // x y - float x = (dot(texture2D(lightMap, lightMapTexCoordX1).rgb, av)- dot(texture2D(lightMap, lightMapTexCoordX2).rgb, av))*shadowIntensity; float y = (dot(texture2D(lightMap, lightMapTexCoordY2).rgb, av)- dot(texture2D(lightMap, lightMapTexCoordY1).rgb, av))*shadowIntensity; float br = dot(lmc.rgb, av); // - vec3 l = vec3(x, y, br); // , z , , , l = normalize(l)*br; // vec3 normal = 2.0*texture2D(colorMap, nmTexCoord.st).rgb-1.0; float a = dot(normal, l)*lightIntensity; a = max(a, 0.0); vec4 c = texture2D(colorMap, texCoord.st); c = a*min(c, lmc)+ambientIntensity*c; // float m = 0.0; // , , (. gif ). . m = max(m, cr); m = max(m, cg); m = max(m, cb); gl_FragColor = c+max(0.0, m-1.0); // . }
рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реАрдбрд┐рдпреЛ:
рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдордирдорд╛рдирд╛ рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╣реИ ,
рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рд╡рд╛ рдХрдг рдПрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╣реИ ред