рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП 3 рдбреА рдЧреЗрдо рд╢реЗрдбреНрд╕

рдЫрд╡рд┐

рдЕрдкрдиреЗ 3 рдбреА рдЧреЗрдо рдореЗрдВ рдмрдирд╛рд╡рдЯ, рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛, рдЫрд╛рдпрд╛, рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ, рдЪрдордХрддреА рд╣реБрдИ рд╡рд╕реНрддреБ, рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛ рдФрд░ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдпрд╣ рд▓реЗрдЦ рдЫрд╛рдпрд╛рдВрдХрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдЦреЗрд▓ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕реНрддрд░ рдХреЛ рдирдИ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рддрдХрдиреАрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХрд┐рд╕реА рднреА рдЯреВрд▓ рд╕реНрдЯреИрдХ рдкрд░ рд▓рд╛рдЧреВ / рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЧреЛрдбреЛрдЯ, рдпреВрдирд┐рдЯреА рдпрд╛ рдХреБрдЫ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╢реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ "рдЧреЛрдВрдж" рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╢рд╛рдирджрд╛рд░ рдЧреЗрдо рдЗрдВрдЬрди рдкрд╛рдВрдбрд╛ 3 рдбреА рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рд╢реЗрдбрд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (рдЬреАрдПрд▓рдПрд╕рдПрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рд╕рдорд╛рди рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдорд┐рд▓реЗрдЧрд╛ - рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдВрдбрд╛ 3 рдбреА рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ рдЫрд╛рдпрд╛рдВрдХрди рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдиреАрдЪреЗ рд╡рд╣ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред

рдмреБрдзрд╡рд╛рд░


рдирдореВрдирд╛ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  • рд▓рд┐рдирдХреНрд╕ рдордВрдЬрд╝рд░реЛ 4.9.135-1-MANJARO
  • OpenGL рд░реЗрдВрдбрд░рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ: GeForce GTX 970 / PCIe / SSE2
  • OpenGL рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ: 4.6.0 NVIDIA 410.73
  • g ++ (GCC) 8.2.1 20180831
  • рдкрд╛рдВрдбрд╛ 3 рдбреА 1.10.1-1

рд╕рд╛рдордЧреНрд░реА


mill-scene.egg рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЗрдВрдбрд░ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рджреЛ рдмрдирд╛рд╡рдЯ рд╣реЛрддреА рд╣реИрдВред

рдкрд╣рд▓реА рдмрдирд╛рд╡рдЯ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ рдлреИрд▓рд╛ рд╣реБрдЖ рдирдХреНрд╢рд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдЕрдкрдиреЗ рд╡рд░реНрдЯрд┐рдХрд▓ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рддреЛ рдПрдХ "рд╕рд╛рджреЗ рдиреАрд▓реЗ" рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рднреА рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдкрджреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдб рд╣реИрдВ, рд╢реЗрдбреНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдЯ рдиреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреГрд╢реНрдп рдЧреНрд░рд╛рдл рдкрд╛рдВрдбрд╛ 3 рдбреА рдЗрдВрдЬрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ ред


рдпрд╣рд╛рдБ рдПрдХ рд░рдВрдЧ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд░рдВрдЧ [red = 128, green = 128, blue = 255] ред

рдпрд╣ рд░рдВрдЧ рдЗрдХрд╛рдИ рдЕрдХреНрд╖ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ z рдЕрдХреНрд╖ рдХреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ [0, 0, 1] ред

 [0, 0, 1] = [ round((0 * 0.5 + 0.5) * 255) , round((0 * 0.5 + 0.5) * 255) , round((1 * 0.5 + 0.5) * 255) ] = [128, 128, 255] = [ round(128 / 255 * 2 - 1) , round(128 / 255 * 2 - 1) , round(255 / 255 * 2 - 1) ] = [0, 0, 1] 

рдпрд╣рд╛рдБ рд╣рдо рдпреВрдирд┐рдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рджреЗрдЦрддреЗ рд╣реИрдВ [0, 0, 1] рдЬрд┐рд╕реЗ рдПрдХ рд╕рд╛рджреЗ рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ [128, 128, 255] , рдФрд░ рд╕реЙрд▓рд┐рдб рдмреНрд▓реВ рдПрдХ рдпреВрдирд┐рдЯ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдУрд╡рд░рд▓реЗ рддрдХрдиреАрдХреЛрдВ рдкрд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред

Panda3D


рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкрд╛рдВрдбрд╛ 3 рдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ "рдЧреЛрдВрдж" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдХрд┐рд╕реА рднреА рдЪрдпрдирд┐рдд рд╕реНрдЯреИрдХ рдпрд╛ рдЧреЗрдо рдЗрдВрдЬрди рдореЗрдВ рдпрд╣рд╛рдВ рдЕрдзреНрдпрдпрди рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рдВрдбрд╛ 3 рдбреА рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдпрд╛ рддреЛ рдЕрдкрдиреЗ рд╕реНрдЯреИрдХ рдореЗрдВ рдЙрдирдХреЗ рд╕рдордХрдХреНрд╖ рдХреЛ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рд╡реЗ рд╕реНрдЯреИрдХ рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЦреБрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВред

рдпрд╣ рдЧреМрд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ gl-coordinate-system default , textures-power-2 down рдФрд░ textures-auto-power-2 1 config.prc рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╡реЗ рдорд╛рдирдХ рдкрд╛рдВрдбрд╛ 3 рдбреА рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рд╣реИрдВред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд╛рдВрдбрд╛ 3 рдбреА рдПрдХ рдКрдкрд░ рдХреА рдУрд░ рдЬреЗрдб рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдПрдХ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреЗ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдУрдкрдирдЬреАрдПрд▓ рдПрдХ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреЗ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдКрдкрд░ рдХреА рдУрд░ рдзреБрд░реА рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред

gl-coordinate-system default рдЖрдкрдХреЛ shaders рдХреЗ рдЕрдВрджрд░ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

textures-auto-power-2 1 рд╣рдореЗрдВ рдЙрди рдмрдирд╛рд╡рдЯ рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ, рдЕрдЧрд░ рд╕рд┐рд╕реНрдЯрдо рдЙрдирдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдПрд╕рдПрд╕рдПрдУ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╕рдордп рдпрд╛ рд╕реНрдХреНрд░реАрди / рдЦрд┐рдбрд╝рдХреА рдХреЗ рднреАрддрд░ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░реАрди / рдЦрд┐рдбрд╝рдХреА рдХрд╛ рдЖрдХрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИред

textures-power-2 down textures рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рджреЛ рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд░рд╛рдмрд░ рдЖрдХрд╛рд░ рд╡рд╛рд▓реЗ рдмрдирд╛рд╡рдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдмрдирд╛рдПрдБ


рдпрджрд┐ рдЖрдк рдирдореВрдирд╛ рдХреЛрдб рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдкрд╛рдВрдбрд╛ 3 рдбреА рд▓рд┐рдирдХреНрд╕, рдореИрдХ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рд▓рд┐рдирдХреНрд╕


рдЕрдкрдиреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред

рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА рд╣реЗрдбрд░ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╡реЗ /usr/lib/panda3d/ /usr/include/panda3d/ рдФрд░ /usr/lib/panda3d/ ред

рдлрд┐рд░ рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git
cd 3d-game-shaders-for-beginners


рдЕрдм рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред

g++ \
-c main.cxx \
-o 3d-game-shaders-for-beginners.o \
-std=gnu++11 \
-O2 \
-I/usr/include/python2.7/ \
-I/usr/include/panda3d/


рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред

g++ \
3d-game-shaders-for-beginners.o \
-o 3d-game-shaders-for-beginners \
-L/usr/lib/panda3d \
-lp3framework \
-lpanda \
-lpandafx \
-lpandaexpress \
-lp3dtoolconfig \
-lp3dtool \
-lp3pystub \
-lp3direct \
-lpthread


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдореИрдиреБрдЕрд▓ рджреЗрдЦреЗрдВред

рдореИрдХ


рдореИрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред

рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА рдХреЗ рд╣реЗрдбрд░ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдВ рд╣реИрдВред

рдлрд┐рд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git
cd 3d-game-shaders-for-beginners


рдЕрдм рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред рдЖрдкрдХреЛ рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдЗрдерди 2.7 рдФрд░ рдкрд╛рдВрдбрд╛ 3 рдбреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдХрд╣рд╛рдВ рд╣реИрдВред

clang++ \
-c main.cxx \
-o 3d-game-shaders-for-beginners.o \
-std=gnu++11 \
-g \
-O2 \
-I/usr/include/python2.7/ \
-I/Developer/Panda3D/include/


рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред

рдЖрдкрдХреЛ рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИрдВред

clang++ \
3d-game-shaders-for-beginners.o \
-o 3d-game-shaders-for-beginners \
-L/Developer/Panda3D/lib \
-lp3framework \
-lpanda \
-lpandafx \
-lpandaexpress \
-lp3dtoolconfig \
-lp3dtool \
-lp3pystub \
-lp3direct \
-lpthread


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдореИрдиреБрдЕрд▓ рджреЗрдЦреЗрдВред

рд╡рд┐рдВрдбреЛрдЬ


рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред

рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА рд╣реЗрдбрд░ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдВ рд╣реИрдВред

рдЗрд╕ рднрдВрдбрд╛рд░ рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред

git clone https://github.com/lettier/3d-game-shaders-for-beginners.git
cd 3d-game-shaders-for-beginners


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 рдбреА рдореИрдиреБрдЕрд▓ рджреЗрдЦреЗрдВред

рдбреЗрдореЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ


рдирдореВрдирд╛ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдореЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡реЗ рд▓рд┐рдирдХреНрд╕ рдпрд╛ рдореИрдХ рдкрд░ рдХреИрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

./3d-game-shaders-for-beginners

рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:

3d-game-shaders-for-beginners.exe

рдХреАрдмреЛрд░реНрдб рдирд┐рдпрдВрддреНрд░рдг


рдбреЗрдореЛ рдореЗрдВ рдПрдХ рдХреАрдмреЛрд░реНрдб рдирд┐рдпрдВрддреНрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХреИрдорд░реЗ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддрд╛рд╡


  • w - рджреГрд╢реНрдп рдореЗрдВ рдЧрд╣рд░реА рдЪрд╛рд▓ред
  • a - рджреГрд╢реНрдп рдХреЛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреБрдорд╛рдПрдВред
  • s - рджреГрд╢реНрдп рд╕реЗ рджреВрд░ рдЬрд╛рдирд╛ред
  • d - рджреГрд╢реНрдп рд╡рд╛рдорд╛рд╡рд░реНрдд рдШреБрдорд╛рдПрдБред

рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рднрд╛рд╡


  • y - рдПрд╕рдПрд╕рдПрдУ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
  • Shift + y - SSAO рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • u - рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред
  • Shift + u - рдХрдВрдЯреНрд░реЛрд▓реНрд╕ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВред
  • i - рдЦрд┐рд▓рдиреЗ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
  • Shift + i - рдмреНрд▓реВрдо рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • o - рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
  • Shift + o - рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • p - рдХреЛрд╣рд░реЗ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред
  • Shift + p - рдХреЛрд╣рд░реЗ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред
  • h - рдХреНрд╖реЗрддреНрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред
  • Shift + h - рдХреНрд╖реЗрддреНрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • j - рдкреЛрд╕реНтАНрдЯрд░рд╛рдЗрдЬреЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
  • Shift + j - рдкреЛрд╕реНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдХреНрд╖рдо рдХрд░реЗрдВ
  • k - рдкрд┐рдХреНрд╕реЗрд▓реЗрд╢рди рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
  • Shift + k - рдкрд┐рдХреНрд╕реЗрд▓рдХрд░рдг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • l - рддреЗрдЬред
  • Shift + l - рдкреИрдирд╛рдкрди рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • n рдлрд┐рд▓реНрдо рдЕрдирд╛рдЬ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ред
  • Shift + n - рдлрд┐рд▓реНрдо рдЕрдирд╛рдЬ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред

рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓реА


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╢реЗрдбреНрд╕ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдпрд╛ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рд╡реЗ рд╕рднреА рдиреАрдЪреЗ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 0, 0) ред рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рдЕрдиреНрдп рд╡реЗрдХреНрдЯрд░ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдПрдХ shader рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЙрд▓рдЭрди рдореЗрдВ рд╕рдордиреНрд╡рд┐рдд рд╕рд┐рд╕реНрдЯрдо рд╣реИред

рдЖрджрд░реНрд╢



рдореЙрдбрд▓ рдпрд╛ рд╡рд╕реНрддреБ рдХрд╛ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЙрдбрд▓ рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрди-рдЖрдпрд╛рдореА рдореЙрдбрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ, рдмреНрд▓реЗрдВрдбрд░ рдореЗрдВ, рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдореЙрдбрд▓ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрд╕рд╛рд░



рд╡рд┐рд╢реНрд╡ рд╕реНрдерд╛рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рджреГрд╢реНрдп / рд╕реНрддрд░ / рдмреНрд░рд╣реНрдорд╛рдВрдб рдХреА рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред

рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди



рджреГрд╢реНрдп рдХрд╛ рд╕рдордиреНрд╡рдп рд╕реНрдерд╛рди рд╕рдХреНрд░рд┐рдп рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред

рд╡рд┐рдЪреНрдЫреЗрджрди



рдХреИрдорд░рд╛ рдлреНрд░реЗрдо рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рд╕реНрдкреЗрд╕ред рдЗрд╕рдореЗрдВ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рдЬрд╛рддреАрдп рд╣реИрдВ рдФрд░ рдЕрдВрддрд░рд╛рд▓ (-1, 1) ред X рдФрд░ y рдХреИрдорд░рд╛ рдлрд┐рд▓реНрдо рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реИрдВ, рдФрд░ z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЧрд╣рд░рд╛рдИ рд╣реИред


рджреГрд╢реНрдпрддрд╛ рдХреЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рднреАрддрд░ рдпрд╛ рдХреИрдорд░реЗ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд╛рд░ рдХрд╛рдЯ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрдорд░реЗ рдХреЗ рджреВрд░ рдХреЗ рд╡рд┐рдорд╛рди рдХреЗ рдкреАрдЫреЗ рд╕реЗ рдХрд╛рдЯреЗ рдЧрдП рдХреНрдпреВрдм рдФрд░ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╕реНрдерд┐рдд рдХреНрдпреВрдм рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рджрд░реНрд╢рди



рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ (рдЖрдорддреМрд░ рдкрд░) рд╣реЛрддрд╛ рд╣реИред X рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред Y рд╢реВрдиреНрдп рд╕реЗ рд╕реНрдХреНрд░реАрди рдХреА рдКрдБрдЪрд╛рдИ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред

GLSL


рддрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдмрд▓ рдЬреАрдкреАрдпреВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рд╢реЗрдбрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ shader рдПрдХ (рдЖрдорддреМрд░ рдкрд░ рдЫреЛрдЯрд╛) рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реА рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдмрд▓ GPU рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдЯреЗрдкреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЗрдбреНрд╕ рдореЗрдВ рд╢реАрд░реНрд╖ рд╢реЗрдб, рдЯреЗрд╕реЗрд▓реЗрд╢рди рд╢реЗрдб, рдЬреНрдпрд╛рдорд┐рддреАрдп, рдЯреБрдХрдбрд╝рд╛ рдФрд░ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╢реЗрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╢реАрд░реНрд╖ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
рдЪрд░рдгред

 #version 140 void main() {} 

рдпрд╣рд╛рдБ рдиреНрдпреВрдирддрдо GLSL рд╢реЗрдбрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ GLSL рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

 #version 140 uniform mat4 p3d_ModelViewProjectionMatrix; in vec4 p3d_Vertex; void main() { gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; } 

рдпрд╣рд╛рдВ рдЫрдВрдЯрдиреА рдХреА рдЧрдИ рд╢реАрд░реНрд╖ рд╢реЗрд▓реНрдбрд░ GLSL рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЛ рдХреНрд▓рд┐рдкрд┐рдВрдЧ рд╕реНрдкреЗрд╕ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕ рдирдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЯреЗрдХреНрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред

main рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ void , рдФрд░ gl_Position рдЪрд░ рдЗрдирд▓рд╛рдЗрди рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рджреЛ рдХреАрд╡рд░реНрдб рд╣реИрдВ: uniform рдФрд░ рдПрдХ in ред

uniform рдХреАрд╡рд░реНрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╕рднреА рд╡рд░реНрдЯрд┐рдХрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред Panda3D рд╕реНрд╡рдпрдВ p3d_ModelViewProjectionMatrix рд╕реЗрдЯ p3d_ModelViewProjectionMatrix рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред

рдХреАрд╡рд░реНрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ shader рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╢реАрд░реНрд╖ shader рдХреЛ рдкреНрд░рддреНрдпреЗрдХ vertex рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ shader рд╕рдВрд▓рдЧреНрди рд╣реЛрддрд╛ рд╣реИред

 #version 140 out vec4 fragColor; void main() { fragColor = vec4(0, 1, 0, 1); } 

рдпрд╣рд╛рдВ рдЫрдВрдЯрдиреА рдХреА рдЧрдИ GLSL рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣рд░реЗ рд░рдВрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреНрд░реАрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЯреБрдХрдбрд╝реЗ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЙрдЯ рдХреАрд╡рд░реНрдб рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

out рдХреАрд╡рд░реНрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ shader рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд╛рдо fragColor рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣рд╛рдБ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рджреЛ рд╢реЗрдбреНрд╕ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

рдмрдирд╛рд╡рдЯ рдкреНрд░рддрд┐рдкрд╛рджрди


рд╕реАрдзреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рд░реЗрдВрдбрд░ / рдбреНрд░рд╛рдЗрдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдирд╛рдо "рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛" (рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛)ред рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдмрдлрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рд╡рдЯ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдПрдХ рд╕рд┐рдВрдЧрд▓ рдлреНрд░реЗрдо рдмрдлрд░ рдореЗрдВ рдХрдИ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЛ рдмрд╛рдВрдз рд╕рдХрддреЗ рд╣реИрдВред

рдлреНрд░реЗрдо рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдмрдирд╛рд╡рдЯ рд╡реИрдХреНрдЯрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ shader рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯ рдЖрдПред рдЖрдорддреМрд░ рдкрд░ рдпреЗ рд╡реИрдХреНрдЯрд░ рд░рдВрдЧреАрди рд╡реИрдХреНрдЯрд░ (r, g, b, a) , рд▓реЗрдХрд┐рди рд╡реЗ рдпрд╛ рддреЛ рд╕реНрдерд┐рддрд┐ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрдХреНрдЯрд░ (x, y, z, w) ред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдзреНрдп рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреБрдХрдбрд╝рд╛ shader рдПрдХ рдЕрд▓рдЧ рд╡реЗрдХреНрдЯрд░ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╢реАрд░реНрд╖ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд╕ рдореЗрдВ рдХрдЯреМрддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Panda3D рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХрд╛ рдереЛрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдЯреЗрдХреНрд╕рдЪрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝рд╛ shader рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЙрдЪреНрдЪ рдлреНрд░реЗрдо рджрд░ (рдПрдлрдкреАрдПрд╕) рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рд╕ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдирдореВрдирд╛ рдХреЛрдб рд╕реЗ рдлреНрд░реЗрдо рдмрдлрд░ рдХреЗ рд▓рд┐рдП рджреЛ рдмрдирд╛рд╡рдЯ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВред


рдкрд╣рд▓реА рд╕рдВрд░рдЪрдирд╛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреА рдПрдХ рдХрд┐рд╕реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдПрдХ рддрд░рдмреВрдЬ рджреГрд╢реНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдЪрдХреНрдХреА рдХреЗ рд╕рд╛рде рдЪрд░рдг рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдиреЗ рд╕реЗ рдЧреБрдЬрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реА рдЕрдВрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдЬрд░рддреА рд╣реИред

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

  • рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рдорд┐рддрд┐ рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рддрд┐ рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐) рдмрдЪрд╛рддрд╛ рд╣реИред
  • рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ) рдмрдЪрд╛рддрд╛ рд╣реИред
  • рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдирд╛рд╡рдЯ (рдлреИрд▓рд╛рдирд╛, рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ, рдЫрд╛рдпрд╛ рдирдХреНрд╢реЗ, рдЖрджрд┐) рдХреЗ рдпреВрд╡реА-рдмрдВрдзрди рдмрдирд╛рддрд╛ рд╣реИред
  • рдкрд░рд┐рд╡реЗрд╢, рдлреИрд▓рд╛рдирд╛, рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
  • рд░реЗрдВрдбрд░ рдХреЛрд╣рд░рд╛ред


рджреВрд╕рд░реА рд╕рдВрд░рдЪрдирд╛ рдПрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдХреИрдорд░рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдХреНрд░реАрди рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рдЖрдпрдд рд╣реИред
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреЗрд╡рд▓ рдЪрд╛рд░ рдЪреЛрдЯрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдВрдЧрдд рдЕрдВрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреА рд╣реИред

рджреВрд╕рд░реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдирдореВрдирд╛ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИ:

  • рдПрдХ рдФрд░ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдПрдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реА рдлреНрд░реЗрдо рдХреЛ рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  // ... bool showPositionBuffer = false; bool showNormalBuffer = false; bool showSsaoBuffer = false; bool showSsaoBlurBuffer = false; bool showMaterialDiffuseBuffer = false; bool showOutlineBuffer = false; bool showBaseBuffer = false; bool showSharpenBuffer = false; bool showBloomBuffer = false; bool showCombineBuffer = false; bool showCombineBlurBuffer = false; bool showDepthOfFieldBuffer = false; bool showPosterizeBuffer = false; bool showPixelizeBuffer = false; bool showFilmGrainBuffer = true; // ... 

рдмрдирд╛рд╡рдЯ



рдЯреЗрдХреНрд╕рдЪрд░рд┐рдВрдЧ рдПрдХ рд░рдВрдЧ рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬреЛ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдпреВ рдФрд░ рд╡реА рдХреЗ рдореВрд▓реНрдп рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рддрдХ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдпреВрд╡реА рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╢реАрд░реНрд╖ рдЫрд╛рдпрд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЦрдВрдбрд┐рдд рд╢реЗрдб рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдпреВрд╡реА рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдпреВрд╡реА рд╕рдордиреНрд╡рдп рдХрд╣реАрдВ-рдХрд╣реАрдВ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдКрд░реНрдзреНрд╡ рдХреЗ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмреАрдЪ рд╣реИред

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░


 #version 140 uniform mat4 p3d_ModelViewProjectionMatrix; in vec2 p3d_MultiTexCoord0; in vec4 p3d_Vertex; out vec2 texCoord; void main() { texCoord = p3d_MultiTexCoord0; gl_Position = p3d_ModelViewProjectionMatrix * p3d_Vertex; } 

рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдЯреЗрдХреНрд╕рдЪрд░ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЛ рдЯреБрдХрдбрд╝рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рд╣реИ: рдпреВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдФрд░ рд╡реА рдХреЗ рд▓рд┐рдП рдПрдХред

рдШрд░реНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛


 #version 140 uniform sampler2D p3d_Texture0; in vec2 texCoord; out vec2 fragColor; void main() { texColor = texture(p3d_Texture0, texCoord); fragColor = texColor; } 

рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЦрдВрдб shader рдЕрдкрдиреЗ UV рд╕рдордиреНрд╡рдп рдореЗрдВ рд░рдВрдЧ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд░рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреНрд░реАрди рднрд░реЗрдВ рдмрдирд╛рд╡рдЯ


 #version 140 uniform sampler2D screenSizedTexture; out vec2 fragColor; void main() { vec2 texSize = textureSize(texture, 0).xy; vec2 texCoord = gl_FragCoord.xy / texSize; texColor = texture(screenSizedTexture, texCoord); fragColor = texColor; } 

рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп, рдЬрд╛рд▓ рдПрдХ рд╕рдкрд╛рдЯ рдЖрдпрдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рдорд╛рди рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЬрд╛рдирддреЗ рд╣реБрдП, рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдП) рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЖрдпрдд рдкрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ, рдФрд░
рдмреА) рдЦрдВрдб рдХреЗ x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред

X рдХреЛ U рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реА рдмрдирд╛рд╡рдЯ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╕реЗ x рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реА рддрд░рд╣, рд╡рд╛рдИ рдХреЛ рд╡реА рд╕реЗ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реА рдмрдирд╛рд╡рдЯ рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рд╡рд╛рдИ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдореВрдирд╛ рдХреЛрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рдХрд╛рд╢



рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдлреИрд▓рд╛рдирд╛, рдлреИрд▓рд╛рдирд╛, рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдирдореВрдирд╛ рдХреЛрдб рдлреЛрдВрдЧ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░


 // ... uniform struct p3d_LightSourceParameters { vec4 color ; vec4 ambient ; vec4 diffuse ; vec4 specular ; vec4 position ; vec3 spotDirection ; float spotExponent ; float spotCutoff ; float spotCosCutoff ; float constantAttenuation ; float linearAttenuation ; float quadraticAttenuation ; vec3 attenuation ; sampler2DShadow shadowMap ; mat4 shadowViewMatrix ; } p3d_LightSource[NUMBER_OF_LIGHTS]; // ... 

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡реЗрд╢реАрдп рдкреНрд░рдХрд╛рд╢ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рдкрд╛рдВрдбрд╛ 3 рдбреА рд╣рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреАрдЬ рдПрдХ рдЫрд╛рдпрд╛ рдирдХреНрд╢рд╛ рд╣реИ рдФрд░ рдЫрд╛рдпрд╛ рдХреЛ рдкреНрд░рдХрд╛рд╢ рдпрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреА рдЬрдЧрд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИред

  // ... vertexPosition = p3d_ModelViewMatrix * p3d_Vertex; // ... for (int i = 0; i < p3d_LightSource.length(); ++i) { vertexInShadowSpaces[i] = p3d_LightSource[i].shadowViewMatrix * vertexPosition; } // ... 

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдореЗрдВ рд╕реАрди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд╕реНрдерд╛рди рд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рдпрд╛ рдкреНрд░рдХрд╛рд╢ рд╕реНрдерд╛рди рдореЗрдВ рдмрджрд▓рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рд╛рдврд╝реЗ рд╕рд╛рдврд╝реЗ рд╕рд╛рдврд╝реЗ рд╕рд╛рдврд╝реЗ рд╕рд╛рддреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЖрдПрдЧрд╛ред рдПрдХ рдЫрд╛рдпрд╛ рдпрд╛ рдкреНрд░рдХрд╛рд╢ рд╕реНрдерд╛рди рдПрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдп рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИ (рдореВрд▓ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╣реИ)ред

рдШрд░реНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛


рдЯреБрдХрдбрд╝рд╛ shader рдкреНрд░рдХрд╛рд╢ рдЧрдгрдирд╛ рдХреЗ рдереЛрдХ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдордЧреНрд░реА


 // ... uniform struct { vec4 ambient ; vec4 diffuse ; vec4 emission ; vec3 specular ; float shininess ; } p3d_Material; // ... 

рдкрд╛рдВрдбрд╛ 3 рдбреА рд╣рдореЗрдВ рдЙрд╕ рдЬрд╛рд▓ рдпрд╛ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА (рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд


  // ... vec4 diffuseSpecular = vec4(0.0, 0.0, 0.0, 0.0); // ... 

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рджреГрд╢реНрдп рдХреА рд░реЛрд╢рдиреА рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдПрдВ, рд╣рдо рдПрдХ рдбреНрд░рд╛рдЗрд╡ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдлреИрд▓рд╛рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд░рдВрдЧ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

  // ... for (int i = 0; i < p3d_LightSource.length(); ++i) { // ... } // ... 

рдЕрдм рд╣рдо рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдлреИрд▓рд╛рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд░рдВрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рдХрд╛рд╢ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░



рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдлреИрд▓рдиреЗ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд░рдВрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЪрд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рд╡реИрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдиреАрд▓рд╛ рддреАрд░ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдПрдХ рд╣рд░рд╛ рддреАрд░ рд╣реИ рдЬреЛ рд▓рдВрдмрд╡рдд рдКрдкрд░ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡реЗрдХреНрдЯрд░ рдПрдХ рдиреАрд▓рд╛ рддреАрд░ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдБрдЦ рдпрд╛ рджреГрд╢реНрдп рд╡реЗрдХреНрдЯрд░ рдирд╛рд░рдВрдЧреА рддреАрд░ рд╣реИ рдЬреЛ рдХреИрдорд░реЗ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред

  // ... vec3 lightDirection = p3d_LightSource[i].position.xyz - vertexPosition.xyz * p3d_LightSource[i].position.w; // ... 

рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╢реАрд░реНрд╖ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░ рд╣реИред

рдпрджрд┐ рдпрд╣ рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рд╣реИ, рддреЛ p3d_LightSource[i].position.w , p3d_LightSource[i].position.w рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рдХреА рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рджрд┐рд╢рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИ, рддреЛ рд░реЛрд╢рдиреА рдХреА рджрд┐рд╢рд╛ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдпрд╛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рдХреЗ рд▓рд┐рдП рдкрд╛рдВрдбрд╛ 3 p3d_LightSource[i].position.xyz -direction to -direction рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

  // ... normal = normalize(vertexNormal); // ... 

рд╢реАрд░реНрд╖ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдПрдХ рдЗрдХрд╛рдИ рд╡реЗрдХреНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреВрдирд┐рдЯ рд╡реИрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред

  // ... vec3 unitLightDirection = normalize(lightDirection); vec3 eyeDirection = normalize(-vertexPosition.xyz); vec3 reflectedDirection = normalize(-reflect(unitLightDirection, normal)); // ... 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рддреАрди рдФрд░ рд╡реИрдХреНрдЯрд░ рдЪрд╛рд╣рд┐рдПред

рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рджрд┐рд╢рд╛ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХрддрд╛ (рдпреВрдирд┐рдЯ рд╡реЗрдХреНрдЯрд░) рдХреЗ рдмрд░рд╛рдмрд░ рджреВрд░реА рдпрд╛ рдкрд░рд┐рдорд╛рдг рджреЗрддрд╛ рд╣реИред

рджреЗрдЦрдиреЗ рдХреА рджрд┐рд╢рд╛ рд╡рд░реНрдЯреЗрдХреНрд╕ / рдЯреБрдХрдбрд╝реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЯреЗрдХреНрд╕ / рдЯреБрдХрдбрд╝рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рд╢реАрд░реНрд╖ / рдЦрдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреИрдорд░рд╛ (рдЖрдВрдЦ) рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ / рдлреНрд░реЗрдЧреНрдореЗрдВрдЯ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рд╡рд░реНрдЯреЗрдХреНрд╕ / рдЯреБрдХрдбрд╝рд╛ рд╕реЗ рдХреИрдорд░рд╛ (рдЖрдВрдЦ) рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВред

рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡реЗрдХреНрдЯрд░ рд╕рддрд╣ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реЛрд╢рдиреА рдХреА рджрд┐рд╢рд╛ рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИред рдЬрдм рдкреНрд░рдХрд╛рд╢ рдХреА "рдХрд┐рд░рдг" рд╕рддрд╣ рдХреЛ рдЫреВрддреА рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕реА рдХреЛрдг рдкрд░ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдЧрд┐рд░ рдЧрдпрд╛ рдерд╛ред рд░реЛрд╢рдиреА рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЛ "рдШрдЯрдирд╛ рдХрд╛ рдХреЛрдг" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡реЗрдХреНрдЯрд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмреАрдЪ рдХреЗ рдХреЛрдг рдХреЛ "рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЛрдг" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдкреНрд░рдХрд╛рд╢ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдВрдЦ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рдорд╛рди рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдВрдЦ рдХреА рджрд┐рд╢рд╛ рдКрдкрд░ / рдЯреБрдХрдбрд╝реЗ рд╕реЗ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рддреА рд╣реИред рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рд░рд┐рдлреНрд▓реЗрдХреНрдЯ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдбрд┐рдлреНрдпреВрдЬрд╝ рд▓рд╛рдЗрдЯрд┐рдВрдЧ


  // ... float diffuseIntensity = max(dot(normal, unitLightDirection), 0.0); if (diffuseIntensity > 0) { // ... } // ... 

рдлреИрд▓рд╛рдирд╛ рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреА рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рдФрд░ рдПрдХрд▓ рд╡реЗрдХреНрдЯрд░ рдХреА рд░реЛрд╢рдиреА рдХреА рджрд┐рд╢рд╛ рд╣реИред рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рджреЛрдиреЛрдВ рд╡реИрдХреНрдЯрд░ рдПрдХ рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЪрдордХ рдПрдХрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХрддрд╛ рд╕реЗ рдХрдо рд╣реЛрдЧрд╛ред


рдпрджрд┐ рд░реЛрд╢рдиреА рд╕рджрд┐рд╢ рд╕рдорд╛рди рджрд┐рд╢рд╛ рдХреА рдУрд░ рдЬрд╛рддреА рд╣реИ, рддреЛ рдлреИрд▓рдиреЗ рд╡рд╛рд▓реА рд░реЛрд╢рдиреА рдХреА рдЪрдордХ рдПрдХрддрд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред

рдпрджрд┐ рдлреИрд▓рд╛рдирд╛ рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рд╢реВрдиреНрдп рд╕реЗ рдХрдо рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  // ... vec4 diffuse = vec4 ( clamp ( diffuseTex.rgb * p3d_LightSource[i].diffuse.rgb * diffuseIntensity , 0 , 1 ) , 1 ); diffuse.r = clamp(diffuse.r, 0, diffuseTex.r); diffuse.g = clamp(diffuse.g, 0, diffuseTex.g); diffuse.b = clamp(diffuse.b, 0, diffuseTex.b); // ... 

рдЕрдм рд╣рдо рдЗрд╕ рд╕реНрд░реЛрдд рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╡рд┐рд╕рд░рд┐рдд рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдпрджрд┐ рдлреИрд▓рд╛рдирд╛ рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдлреИрд▓рд╛рдирд╛ рдмрдирд╛рд╡рдЯ рдХреЗ рд░рдВрдЧ рдФрд░ рдкреНрд░рдХрд╛рд╢ рдХреЗ рд░рдВрдЧ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЪрдордХ рдкрд░, рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдЧрд╣рд░рд╛ рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рдлреИрд▓рд╛рдиреЗ рдХреА рдмрдирд╛рд╡рдЯ рдХреЗ рд░рдВрдЧ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдЬреНрдЬреНрд╡рд▓ рди рд╣реЛред рдпрд╣ рджреГрд╢реНрдп рдХреЗ рдУрд╡рд░рдПрдХреНрд╕рдкреЛрдЬрд░ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред

рдкреНрд░рдХрд╛рд╢ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд


рдлреИрд▓рд╛рдирд╛ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред


  // ... vec4 specular = clamp ( vec4(p3d_Material.specular, 1) * p3d_LightSource[i].specular * pow ( max(dot(reflectedDirection, eyeDirection), 0) , p3d_Material.shininess ) , 0 , 1 ); // ... 

рдкрд░рд╛рд╡рд░реНрддрд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рдЖрдВрдЦ рд╡реЗрдХреНрдЯрд░ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡реЗрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рд╣реИред рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рд╕рд░рд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рджреЛ рд╡реИрдХреНрдЯрд░ рдПрдХ рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд╢ рдХреА рдЪрдордХ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдХреЛрдИ рдЕрдиреНрдп рдЪрдордХ рдЗрд╕ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХреА рдЧрдИ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд░рдВрдЧ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧреАред


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

рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ


  // ... float unitLightDirectionDelta = dot ( normalize(p3d_LightSource[i].spotDirection) , -unitLightDirection ); if (unitLightDirectionDelta >= p3d_LightSource[i].spotCosCutoff) { // ... } // ... } 

рдпрд╣ рдХреЛрдб рдкреНрд░рдХрд╛рд╢ рдХреЛ рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рд╢рдВрдХреБ рдпрд╛ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Panda3D рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд spotDirection рдФрд░ spotCosCutoffрджрд┐рд╢рд╛рддреНрдордХ рдФрд░ рдореМрдХреЗ рд░реЛрд╢рдиреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рдПрдХ рджрд┐рд╢рд╛ рджреЛрдиреЛрдВ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рдХреЗрд╡рд▓ рджрд┐рд╢рд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдмрд┐рдВрджреБ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЛрдб рдмрдпрд╛рдиреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 spotCosCutoff = cosine(0.5 * spotlightLensFovAngle); 

рдЕрдЧрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж "рд░реЛрд╢рдиреА рдХрд╛ рдЯреБрдХрдбрд╝рд╛-рд╕реНрд░реЛрдд" рдФрд░ рд╕рд░реНрдЪрд▓рд╛рдЗрдЯ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдЦреЛрдЬ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдзреЗ рдХреЛрдг рдХреЗ рдХреЛрд╕рд╛рдЗрди рд╕реЗ рдХрдо рд╣реИ
, рддреЛ рд╢реЗрдбрд░ рдЗрд╕ рд╕реНрд░реЛрдд рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕рд╛рдЗрди рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ unitLightDirectionред unitLightDirectionрдЦреЛрдЬ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЦреЛрдЬ рд╕реЗ рдЦрдВрдб рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ spotDirectionрд╕реАрдзреЗ рд╕рд░реНрдЪрд▓рд╛рдЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рджреВрд░реА рдкрд░ рдЦреЛрдЬ рдХреЗ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред

рджрд┐рд╢рд╛рддреНрдордХ рдФрд░ рд╕реНрдкреЙрдЯ рд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╛рдВрдбрд╛ 3 рдбреА spotCosCutoff-1 рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдХреЗрд▓рд░ рдЙрддреНрдкрд╛рдж -1 рд╕реЗ 1. рддрдХ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ unitLightDirectionDelta, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ -1 рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред

  // ... diffuse *= pow(unitLightDirectionDelta, p3d_LightSource[i].spotExponent); // ... 

рдХреЛрдб рдХреА рддрд░рд╣ unitLightDirectionDelta, рдпрд╣ рдХреЛрдб рднреА рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЙрдЬреНрдЬрд╡рд▓ рдмрдирд╛ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкреЙрдЯрд▓рд╛рдЗрдЯ рдкрд┐рд░рд╛рдорд┐рдб рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд╢ рдХреЗ рджрд┐рд╢рд╛рддреНрдордХ рдФрд░ рдмрд┐рдВрджреБ рд╕реНрд░реЛрддреЛрдВ рдХреЗ spotExponentрд▓рд┐рдП рд╢реВрдиреНрдп рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╢реВрдиреНрдп рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдореВрд▓реНрдп рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдЦреБрдж рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдПрдХ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдмрджрд▓рддрд╛ рдирд╣реАрдВ рд╣реИред

рдЫрд╛рдпрд╛


  // ... float shadow = textureProj ( p3d_LightSource[i].shadowMap , vertexInShadowSpaces[i] ); diffuse.rgb *= shadow; specular.rgb *= shadow; // ... 

рдкрд╛рдВрдбрд╛ 3 рдбреА рдЫрд╛рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рдЫрд╛рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИред рд╕реНрд╡рдпрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдкреНрд░рдХрд╛рд╢ рд╕реНрдерд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ (рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ)ред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджреГрд╢реНрдп рдХреЛ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝реНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рдЕрдВрд╢реЛрдВ рддрдХ рдХреА рджреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ "рдЧрд╣рд░рд╛рдИ рдХрд╛ рдирдХреНрд╢рд╛" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╣реЛрдордореЗрдб рдбреЗрдкреНрде рдореИрдк рдХреЛ рд╢реЗрдбрд░ рдХреЗ рд░реВрдк uniform sampler2DShadowрдореЗрдВ рдФрд░ рд╢реИрдбреЛ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ uniform mat4ред рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреБрди: рдмрдирд╛рдПрдВрдЧреЗ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ textureProj, рдЬреЛ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрд▓рдЧ рд╣реИ textureред textureProjрдкрд╣рд▓реЗ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд vertexInShadowSpaces[i].xyzрд╣реИ vertexInShadowSpaces[i].wред рд╡рд╣ рдлрд┐рд░ vertexInShadowSpaces[i].xyрдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЧрд╣рд░рд╛рдИ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдлрд┐рд░ рд╡рд╣ vertexInShadowSpaces[i].zрдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рд╛рде рд╢реАрд░реНрд╖ рдХреА рдЧрд╣рд░рд╛рдИ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ vertexInShadowSpaces[i].xyред рдпрджрд┐ рддреБрд▓рдирд╛ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ textureProjрдПрдХ рд▓реМрдЯ рдЖрддреА рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрд╣ рд╢реВрдиреНрдп рджреЗрддрд╛ рд╣реИред рд╢реВрдиреНрдп рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рд╢реАрд░реНрд╖ / рдЯреБрдХрдбрд╝рд╛ рдЫрд╛рдпрд╛ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖ / рдЯреБрдХрдбрд╝рд╛ рдЫрд╛рдпрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ textureProjрдпрд╣ рдПрдХ рдорд╛рди рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рддрдХ рднреА рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВtextureProjрдЖрд╕рдиреНрди рдЧрд╣рд░рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдЧрд╣рд░рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рднрд╛рд░рд┐рдд рдФрд╕рдд рджреЗрддрд╛ рд╣реИред рдпрд╣ рднрд╛рд░рд┐рдд рдФрд╕рдд рдЫрд╛рдпрд╛ рдХреЛ рдЪрд┐рдХрдирд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред

рдХреНрд╖реАрдгрди



  // ... float lightDistance = length(lightDirection); float attenuation = 1 / ( p3d_LightSource[i].constantAttenuation + p3d_LightSource[i].linearAttenuation * lightDistance + p3d_LightSource[i].quadraticAttenuation * (lightDistance * lightDistance) ); diffuse.rgb *= attenuation; specular.rgb *= attenuation; // ... 

рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рджреВрд░реА рдкреНрд░рдХрд╛рд╢ рдХреА рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ рдХреА рднрдпрд╛рд╡рд╣рддрд╛ рдпрд╛ рд▓рдВрдмрд╛рдИ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд░реЛрд╢рдиреА рдХреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рджрд┐рд╢рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реА рджреВрд░реА рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред

рдХреНрд╖реАрдгрди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рджреВрд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЧрддрд┐рд░реЛрдз рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕реНрд░реЛрдд рд╕реЗ рджреВрд░ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкреИрд░рд╛рдореАрдЯрд░ constantAttenuation, linearAttenuationрдФрд░ quadraticAttenuationрдЖрдк рдХреЛрдИ рднреА рдорд╛рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ constantAttenuation = 1, linearAttenuation = 0рдФрд░ quadraticAttenuation = 1ред рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдкрд░ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд░рдВрдЧ рдкреНрд░рдХрд╛рд╢


  // ... diffuseSpecular += (diffuse + specular); // ... 

рдкреНрд░рдХрд╛рд╢ рдХреЗ рдЕрдВрддрд┐рдо рд░рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреИрд▓рд╛рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рд░рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рд╡реНрдпрд╛рдкрдХ


 // ... uniform sampler2D p3d_Texture1; // ... uniform struct { vec4 ambient ; } p3d_LightModel; // ... in vec2 diffuseCoord; // ... vec4 diffuseTex = texture(p3d_Texture1, diffuseCoord); // ... vec4 ambient = p3d_Material.ambient * p3d_LightModel.ambient * diffuseTex; // ... 

рдкреНрд░рдХрд╛рд╢ рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рдШрдЯрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкрд░рд┐рд╡реЗрд╢ рд░рдВрдЧ, рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рд░рдВрдЧ, рдФрд░ рдлреИрд▓рд╛рдирд╛ рдмрдирд╛рд╡рдЯ рдХреЗ рд░рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрд░реЛрдд рдХрднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд┐рдд рд╡рд┐рд╕рд░рд┐рдд рдФрд░ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд░рдВрдЧреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдЧрдгрдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ SSAO рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рд╡реЗрд╢ рдкреНрд░рдХрд╛рд╢ рдХрд╛ рд░рдВрдЧ рдХрд╛рдо рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


  // ... vec4 outputColor = ambient + diffuseSpecular + p3d_Material.emission; // ... 

рдЕрдВрддрд┐рдо рд░рдВрдЧ рдкрд░рд┐рд╡реЗрд╢ рд░рдВрдЧ, рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ, рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд░рдВрдЧ рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд░рдВрдЧ рдХрд╛ рдпреЛрдЧ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб



рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ



рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╕рддрд╣ рдкрд░ рдирдП рднрд╛рдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдЬрдм рдПрдХ 3 рдбреА рдореЙрдбрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд╖ рдХреЗ рдЙрдЪреНрдЪ рдФрд░ рдирд┐рдореНрди рдкрд╛рд▓реА рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЙрдЪреНрдЪ рдкрд╛рд▓реА рдЬрд╛рд▓ рд╕реЗ рдХреЛрдиреЗ рдХрд╛ рдорд╛рдирджрдВрдб рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдмреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрдирд╛рд╡рдЯ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢рд╛ рд╣реИред рдлрд┐рд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЕрдВрджрд░ рд╣рдо рдХрдо рдкреЙрд▓реА рдореЗрд╖ рдХреЗ рдХреЛрдиреЗ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдореЗрдВ рдмреЗрдХ рдХрд┐рдП рдЧрдП рдЙрдЪреНрдЪ рдкреЙрд▓реА рдореЗрд╖ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЬрдм рдПрдХ рдЬрд╛рд▓ рдХреЛ рдЬрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╣реБрднреБрдЬ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдЙрдЪреНрдЪ-рдкрд╛рд▓реА рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЙрдЪреНрдЪ рдПрдлрдкреАрдПрд╕ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЙрдЪреНрдЪ рдкрд╛рд▓реА рдореЙрдбрд▓ рд╕реЗ рдирд┐рдореНрди рдкреЙрд▓реА рдореЙрдбрд▓ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдХрдо рдкрд╛рд▓реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рд┐рдВрдкрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдУрд╡рд░рд▓реЗ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рднреНрд░рдо рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреЛрдг рдкрд░, рд╕рддрд╣ рдлрд┐рд░ рд╕реЗ рд╕рдкрд╛рдЯ рджрд┐рдЦрдиреЗ рд▓рдЧрддреА рд╣реИред

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░


 // ... uniform mat3 p3d_NormalMatrix; // ... in vec3 p3d_Normal; // ... in vec3 p3d_Binormal; in vec3 p3d_Tangent; // ... vertexNormal = normalize(p3d_NormalMatrix * p3d_Normal); binormal = normalize(p3d_NormalMatrix * p3d_Binormal); tangent = normalize(p3d_NormalMatrix * p3d_Tangent); // ... 

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░, рдмрд╛рдпреЛрдореЗрдирд┐рдХрд▓ рд╡реЗрдХреНрдЯрд░, рдФрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрди рд╡реИрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

p3d_NormalMatrixрд╡рд░реНрд╕реЗрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реИрдХреНрдЯрд░, рдмрд╛рдпрдиреЙрд░реНрдорд▓ рдФрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕рджрд┐рд╢ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВред

[p3d_NormalMatrix] ModelViewMatrix рдХреЗ рд╢реАрд░реНрд╖ 3x3 рд░рд┐рд╡рд░реНрд╕ рдЯреНрд░рд╛рдВрд╕рдкреЛрд╕реЗрдВрдЯ рддрддреНрд╡ рд╣реИрдВред рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред

рд╕реНрд░реЛрдд

 // ... in vec2 p3d_MultiTexCoord0; // ... out vec2 normalCoord; // ... normalCoord = p3d_MultiTexCoord0; // ... 


рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдореИрдк рдХреЗ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рднрдЧрджрдбрд╝ рд╢реИрдбрд░


рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд╢ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЯреЗрдХреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рдХрд╛рд╢ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рд╣рдореЗрдВ рдЕрдиреНрдп рдорд╛рдирджрдВрдб рджреЗрддрд╛ рд╣реИред рдЦрдВрдб рдЫрд╛рдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдореЗрдВ рд╕реНрдерд┐рдд рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдиреЗ рдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 // ... uniform sampler2D p3d_Texture0; // ... in vec2 normalCoord; // ... /* Find */ vec4 normalTex = texture(p3d_Texture0, normalCoord); // ... 

рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд╕рдВрдЧрдд рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред

  // ... vec3 normal; // ... /* Unpack */ normal = normalize ( normalTex.rgb * 2.0 - 1.0 ); // ... 

рдКрдкрд░, рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд░рдВрдЧреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрд▓рдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдореВрд▓ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдирдХреНрд╢реЗ рдкрд░ рдмреЗрдХ рдХрд░ рд╕рдХреЗрдВред

 [ r, g, b] = [ r * 2 - 1, g * 2 - 1, b * 2 - 1] = [ x, y, z] 

рдпрд╣рд╛рдБ рд╕рд╛рдорд╛рдиреНрдп рдирдХреНрд╢реЗ рд╕реЗ рдорд╛рдирджрдВрдб рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

  // ... /* Transform */ normal = normalize ( mat3 ( tangent , binormal , vertexNormal ) * normal ); // ... 

рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рдирджрдВрдб рдЖрдорддреМрд░ рдкрд░ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЗрдВрдбрд░ рдЖрдкрдХреЛ рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреЗрд╕, рд╡рд░реНрд▓реНрдб рд╕реНрдкреЗрд╕ рдФрд░ рдХреИрдорд░рд╛ рд╕реНрдкреЗрд╕ рдореЗрдВ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕реЗрдВрдХрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕реНрдерд╛рди рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд╛рди рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛ рд╕рджрд┐рд╢, рджреНрд╡рд┐рдШрд╛рдд рд╡реИрдХреНрдЯрд░ рдФрд░ рд╢реАрд░реНрд╖ рд╕рд╛рдорд╛рдиреНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд 3x3 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдПрдВред рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдПред рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд╢ рдЧрдгрдирд╛ рдЕрднреА рднреА рдХреА рдЬрд╛рддреА рд╣реИрдВред

рд╕реНрд░реЛрдд рдХреЛрдб


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


All Articles