рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП 3 рдбреА рдЧреЗрдо рд╢реЗрдбреНрд╕: рдкреНрд░рднрд╛рд╡

[ рдкрд╣рд▓рд╛ рднрд╛рдЧ ]

рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рдирд┐рдкрдЯрд╛, рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╡рд╕реНрддреБ рд░реВрдкрд░реЗрдЦрд╛, рдЦрд┐рд▓, SSAO, рдХрд▓рдВрдХ, рдХреНрд╖реЗрддреНрд░ рдХреА рдЧрд╣рд░рд╛рдИ, рдкрд┐рдХреНрд╕реЗрд▓рдХрд░рдг, рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рд░реВрдкрд░реЗрдЦрд╛



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

рдбрд┐рдлреНрдпреВрдЬрд╝ рдордЯреАрд░рд┐рдпрд▓


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

uniform struct { vec4 diffuse ; } p3d_Material; out vec4 fragColor; void main() { vec3 diffuseColor = p3d_Material.diffuse.rgb; fragColor = vec4(diffuseColor, 1); } 

рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ shader рд╣реИ рдЬреЛ рдПрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдлреИрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рд░рдВрдЧ рдХреЛ рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдлреНрд░реЗрдо рдмрдлрд░ рд╕реЗ рдпрд╣ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдмрдирд╛рд╡рдЯ рдкрде shader рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдмрдирд╛рд╡рдЯ рд╣реЛрдЧреАред


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

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рджреГрд╢реНрдп рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдкрдирд╛ рдлреИрд▓рд╛рдирд╛ рд░рдВрдЧ рдирд╣реАрдВ рд╣реИред

рдХрд┐рдирд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг



рдХрд┐рдирд╛рд░реЗ рдмрдирд╛рдирд╛ GIMP рдореЗрдВ рдПрдЬ рд░рд┐рдХрдЧреНрдирд┐рд╢рди рдлрд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред

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

 // ... uniform sampler2D materialDiffuseTexture; // ... vec2 texSize = textureSize(materialDiffuseTexture, 0).xy; vec2 texCoord = gl_FragCoord.xy; // ... 

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

  // ... int separation = 1; // ... 

рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдХреЗ рдЕрдиреБрд░реВрдк separation рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреГрдердХреНрдХрд░рдг, рдХрд┐рдирд╛рд░реЛрдВ рдпрд╛ рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдореЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИред

  // ... float threshold = 0; // ... vec4 mx = vec4(0); vec4 mn = vec4(1); int x = -1; int y = -1; for (int i = 0; i < 9; ++i) { vec4 color = texture ( materialDiffuseTexture , (texCoord + (vec2(x, y) * separation)) / texSize ); mx = max(color, mx); mn = min(color, mn); x += 1; if (x >= 2) { x = -1; y += 1; } } float alpha = ((mx.r + mx.g + mx.b) / 3) - ((mn.r + mn.g + mn.b) / 3); if (alpha > threshold) { alpha = 1; } // ... 


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

  // ... vec3 lineRgb = vec3(0.012, 0.014, 0.022); // ... vec4 lineColor = vec4(lineRgb, alpha); // ... fragColor = lineColor; // ... 

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

  // ... float threshold = 0; // ... if (alpha > threshold) { alpha = 1; } // ... 

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

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



рдХреЛрд╣рд░рд╛



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

 // ... uniform struct p3d_FogParameters { vec4 color ; float start ; float end ; } p3d_Fog; // ... 

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

  // ... float fogIntensity = clamp ( ( p3d_Fog.end - vertexPosition.y) / ( p3d_Fog.end - p3d_Fog.start) , 0 , 1 ); fogIntensity = 1 - fogIntensity; // ... 

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреИрдорд░реЗ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдкрд░ рдХреЛрд╣рд░реЗ рдХреА рдЪрдордХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдЦреАрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдШрд╛рддреАрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрд╣рд░реЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрд╣рд░реЗ рдХреА рдЪрдордХ рд╢реВрдиреНрдп рд╣реЛрддреА рд╣реИред рдЬрдм рд╢реАрд░реНрд╖ рд╕реНрдерд┐рддрд┐ рдХреЛрд╣рд░реЗ рдХреЗ рдЕрдВрдд рддрдХ fogIntensity , рддреЛ fogIntensity рдПрдХрддрд╛ рдХреЗ fogIntensity рдкрд╣реБрдВрдЪрддреА рд╣реИред рдХреЛрд╣рд░реЗ рдХреЗ рдЦрддреНрдо рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рднреА fogIntensity , рдКрдкрд░ рд╕реЗ 1 рддрдХ рд╕реАрдорд┐рдд рд╣реИред

  // ... fragColor = mix ( outputColor , p3d_Fog.color , fogIntensity ); // ... 

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

рдХреЛрд╣рд░реЗ рдкрд░ рдХреЛрд╣рд░реЗ




 // ... uniform sampler2D positionTexture; // ... vec4 position = texture(positionTexture, texCoord / texSize); float fogIntensity = clamp ( ( p3d_Fog.end - position.y) / ( p3d_Fog.end - p3d_Fog.start) , 0 , 1 ); fogIntensity = 1 - fogIntensity; vec4 lineWithFogColor = mix ( lineColor , p3d_Fog.color , fogIntensity ); fragColor = vec4(lineWithFogColor.rgb, alpha); // ... 

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

positionTexture рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдЯреЗрдХреНрд╕рдЪрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпреВ рд╕реНрдкреЗрд╕ рдХреЗ рд╡рд░реНрдЯрд┐рдХрд▓ рдХреЗ рдкреЛрдЬрд┐рд╢рди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рд╣рдо SSAO shader рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗред

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



рдлреВрд▓



рджреГрд╢реНрдп рдореЗрдВ рдЦрд┐рд▓рдиреЗ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдареЛрд╕ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд╢ рдЙрддреНрд╕рд░реНрдЬрдХ рд╡рд╕реНрддреБрдПрдВ рдЕрдзрд┐рдХ рдареЛрд╕ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдкреНрд░рдХрд╛рд╢ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

  //... float separation = 3; int samples = 15; float threshold = 0.5; float amount = 1; // ... 

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

  // ... int size = samples; int size2 = size * size; int x = 0; int y = 0; // ... float value = 0; vec4 result = vec4(0); vec4 color = vec4(0); // ... for (int i = 0; i < size2; ++i) { // ... } // ... 

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

  // ... color = texture ( bloomTexture , ( gl_FragCoord.xy + vec2(x * separation, y * separation) ) / texSize ); value = ((0.3 * color.r) + (0.59 * color.g) + (0.11 * color.b)); if (value < threshold) { color = vec4(0); } result += color; // ... 

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

рдЦрд┐рдбрд╝рдХреА рдХреЗ рднреАрддрд░ рд╕рднреА рдирдореВрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рдпрд╣ result рдореЗрдВ рдЙрдирдХреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рддрд╛ рд╣реИред

  // ... result = result / size2; // ... 

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


рдпрд╣рд╛рдБ рдЖрдк рдмреНрд▓реВрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВред

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



рд╕реНрдХреНрд░реАрди рд╕реНрдкреЗрд╕ рдПрдВрдмрд┐рдПрдВрдЯ рдЗрдВрдХреНрд▓реВрдЬрди (SSAO)



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

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

рдЖрд╡рдХ рдбреЗрдЯрд╛


SSAO shader рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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

рд╕реНрдерд┐рддрд┐



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

 PT(Texture) depthTexture = new Texture("depthTexture"); depthTexture->set_format(Texture::Format::F_depth_component32); PT(GraphicsOutput) depthBuffer = graphicsOutput->make_texture_buffer("depthBuffer", 0, 0, depthTexture); depthBuffer->set_clear_color(LVecBase4f(0, 0, 0, 0)); NodePath depthCameraNP = window->make_camera(); DCAST(Camera, depthCameraNP.node())->set_lens(window->get_camera(0)->get_lens()); PT(DisplayRegion) depthBufferRegion = depthBuffer->make_display_region(0, 1, 0, 1); depthBufferRegion->set_camera(depthCameraNP); 

рдпрджрд┐ рдЖрдк рдЧрд╣рд░рд╛рдИ рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╛рдВрдбрд╛ 3 рдбреА рдореЗрдВ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 in vec4 vertexPosition; out vec4 fragColor; void main() { fragColor = vertexPosition; } 

рдпрд╣рд╛рдБ рдПрдХ рдмрдлрд░ рдмрдлрд░ рдмрдирд╛рд╡рдЯ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рд╢реАрд░реНрд╖ рдкрджреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг shader рд╣реИред рдПрдХ рдЕрдзрд┐рдХ рдХрдард┐рди рдХрд╛рд░реНрдп рдлреНрд░реЗрдо рдмрдлрд░ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЯреБрдХрдбрд╝реЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХ рдЕрдВрддрд░рд╛рд▓ [0, 1] рддрдХ рд╕реАрдорд┐рдд рди рд╣реЛрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ (рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд┐рдЯреНрд╕) рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рд╢реАрд░реНрд╖ рд╕реНрдерд╛рди рд╕реНрдерд┐рддрд┐ <-139.444444566, 0.00000034343, 2.5> , рддреЛ рдЖрдк рдЗрд╕реЗ рдмрдирд╛рд╡рдЯ рдХреЗ рд░реВрдк рдореЗрдВ <0.0, 0.0, 1.0> рдирд╣реАрдВ рдмрдЪрд╛ рд╕рдХрддреЗред

  // ... FrameBufferProperties fbp = FrameBufferProperties::get_default(); // ... fbp.set_rgba_bits(32, 32, 32, 32); fbp.set_rgb_color(true); fbp.set_float_color(true); // ... 

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд╣реИ рдЬреЛ рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреЛрдЬреАрд╢рди рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдмрдирд╛рд╡рдЯ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЙрд╕реЗ рд▓рд╛рд▓, рд╣рд░реЗ, рдиреАрд▓реЗ рдФрд░ рдЕрд▓реНрдлрд╛ рдХреЗ рд▓рд┐рдП 32 рдмрд┐рдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдЕрдВрддрд░рд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддрд╛ рд╣реИ [0, 1] ред set_rgba_bits(32, 32, 32, 32) рд▓рд┐рдП рдХреЙрд▓ рдмрд┐рдЯ рд╡реЙрд▓реНрдпреВрдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

  glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGB32F , 1200 , 900 , 0 , GL_RGB , GL_FLOAT , nullptr ); 

рдпрд╣рд╛рдБ OpenGL рдкрд░ рдПрдХ рд╕рдорд╛рди рдХреЙрд▓ рд╣реИред GL_RGB32F рдмрд┐рдЯреНрд╕ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд░рдВрдЧреАрди рдмрдлрд░ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рдЕрдВрддрд┐рдо рдФрд░ рдЕрдВрддрд┐рдо рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдорд┐рд╢реНрд░рдг рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдорд┐рд╢реНрд░рд┐рдд рд╕рдореАрдХрд░рдг рдХреА рдЧрдгрдирд╛ [0, 1] рдпрд╛ [тИТ1, 1] рддрдХ рд╕реАрдорд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░рдВрдЧреАрди рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд░рдВрдЧ рдмрдлрд░ рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред

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


рдпрд╣рд╛рдБ рдЖрдк рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦрддреЗ рд╣реИрдВ; y рдЕрдХреНрд╖ рдКрдкрд░ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ PAND3D рдПрдХ рдЕрдХреНрд╖ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП z рдЕрдХреНрд╖ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ OpenGL рдореЗрдВ y рдЕрдХреНрд╖ рдКрдкрд░ рджрд┐рдЦрддрд╛ рд╣реИред рдкреИрдВрдбрд░ 3 рдбреА рдореЗрдВ рдкреЛрдЬрд┐рд╢рди shader рдЙрд░реНрдзреНрд╡ z рдХреЗ рд╕рд╛рде рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
gl-coordinate-system default рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

normals



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

 in vec3 vertexNormal; out vec4 fragColor; void main() { vec3 normal = normalize(vertexNormal); fragColor = vec4(normal, 1); } 

рд╕реНрдерд┐рддрд┐ shader рдХреА рддрд░рд╣, рд╕рд╛рдорд╛рдиреНрдп shader рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╡реЗ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рд╣реИрдВред


рдХреЛрдиреЗ рдХреЗ рдорд╛рдирджрдВрдб рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ; y рдЕрдХреНрд╖ рдКрдкрд░ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкрд╛рдВрдбрд╛ 3 рдбреА z рдЕрдХреНрд╖ рдХреЛ рдЙрд░реНрдзреНрд╡рд╛рдзрд░ рд╡реЗрдХреНрдЯрд░, рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдХреЛ y рдЕрдХреНрд╖ рдорд╛рдирддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп shader z рдЕрдХреНрд╖ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ gl-coordinate-system default 3D рдореЗрдВ рдЧреНрд▓ gl-coordinate-system default рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирдореВрдиреЗ


рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред

  // ... for (int i = 0; i < numberOfSamples; ++i) { LVecBase3f sample = LVecBase3f ( randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) ).normalized(); float rand = randomFloats(generator); sample[0] *= rand; sample[1] *= rand; sample[2] *= rand; float scale = (float) i / (float) numberOfSamples; scale = lerp(0.1, 1.0, scale * scale); sample[0] *= scale; sample[1] *= scale; sample[2] *= scale; ssaoSamples.push_back(sample); } // ... 

рдирдореВрдирд╛ рдХреЛрдб рдПрдХ рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рд╡рд┐рддрд░рд┐рдд 64 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдиреЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпреЗ ssaoSamples SSAO shader рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред

  LVecBase3f sample = LVecBase3f ( randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 ).normalized(); 

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдирдореВрдиреЛрдВ рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдШрдЯрдХ z рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╕реЗ рдПрдХ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПред

рд╢реЛрд░


  // ... for (int i = 0; i < 16; ++i) { LVecBase3f noise = LVecBase3f ( randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 , 0.0 ); ssaoNoise.push_back(noise); } // ... 

рдирдореВрдирд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реЛрд░ рд╡реИрдХреНрдЯрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпреЗ рд╢реЛрд░ рд╡реИрдХреНрдЯрд░ рд╕рддрд╣ рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдирдореВрдиреЛрдВ рдХреЛ рдШреБрдорд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рд╡реЗрд╢ рд░реЛрдбрд╝рд╛



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


рдпрд╣рд╛рдБ рдЖрдкрдХреЛ рд╕рддрд╣ рдХреЗ рдКрдкрд░ рд╕реНрдерд╛рди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд░реЛрдбрд╝рд╛ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рд╣реИред

  // ... float radius = 1.1; float bias = 0.026; float lowerRange = -2; float upperRange = 2; // ... 

рдХреБрдЫ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреА рддрд░рд╣, SSAO shader рдореЗрдВ рдХрдИ рдирд┐рдпрдВрддреНрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЙрдкрд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдирдореВрдирд╛ рд╕реЗ рдХреИрдорд░реЗ рдХреА рджреВрд░реА рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рджрд╛рдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреНрд░рд┐рдЬреНрдпрд╛ рдирдореВрдирд╛ рд╕реНрдерд╛рди рдХреЗ рдХрд╡рд░реЗрдЬ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рдпрд╛ рдШрдЯрд╛рддрд╛ рд╣реИред рд▓реЛрдЕрд░рд░реЗрдВрдЬ рдФрд░ рдЕрдкрд░рд░реЗрдВрдЬ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдХ рдореАрдЯреНрд░рд┐рдХ рдХреА рдорд╛рдирдХ рд╕реАрдорд╛ рдХреЛ [0, 1] рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рд╕реАрдорд╛ рдмрдврд╝рд╛рдХрд░, рдЖрдк рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред

  // ... vec4 position = texture(positionTexture, texCoord); vec3 normal = texture(normalTexture, texCoord).xyz; int noiseX = int(gl_FragCoord.x - 0.5) % 4; int noiseY = int(gl_FragCoord.y - 0.5) % 4; vec3 random = noise[noiseX + (noiseY * 4)]; // ... 

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

  // ... vec3 tangent = normalize(random - normal * dot(random, normal)); vec3 binormal = cross(normal, tangent); mat3 tbn = mat3(tangent, binormal, normal); // ... 

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

  // ... float occlusion = NUM_SAMPLES; for (int i = 0; i < NUM_SAMPLES; ++i) { // ... } // ... 

рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╢реЗрдбрд░ рд▓реВрдк рдХреЗ рд╕рднреА рдирдореВрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдШрдЯрд╛рдПред

  // ... vec3 sample = tbn * samples[i]; sample = position.xyz + sample * radius; // ... 

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

  // ... vec4 offset = vec4(sample, 1.0); offset = lensProjection * offset; offset.xyz /= offset.w; offset.xyz = offset.xyz * 0.5 + 0.5; // ... 

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

 -1 * 0.5 + 0.5 = 0 1 * 0.5 + 0.5 = 1 

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

  // ... vec4 offsetPosition = texture(positionTexture, offset.xy); float occluded = 0; if (sample.y + bias <= offsetPosition.y) { occluded = 0; } else { occluded = 1; } // ... 

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

  // ... float intensity = smoothstep ( 0.0 , 1.0 , radius / abs(position.y - offsetPosition.y) ); occluded *= intensity; occlusion -= occluded; // ... 

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

  // ... occlusion /= NUM_SAMPLES; // ... fragColor = vec4(vec3(occlusion), position.a); // ... 

рдЕрдВрддрд░рд╛рд▓ [0, NUM_SAMPLES] рд╕реЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ [0, 1] рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдУрд╡рд░рд▓реИрдк рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВред рд╢реВрдиреНрдп рдХрд╛ рдорддрд▓рдм рдкреВрд░реНрдг рд░реЛрдбрд╝рд╛ рд╣реИ, рдЗрдХрд╛рдЗрдпреЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХреЛрдИ рд░реЛрдбрд╝рд╛ рдирд╣реАрдВред рдЕрдм рд╡рд┐рдЦрдВрдбрди рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдЦрдВрдб рд░рдВрдЧ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ, рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ, рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЛ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдмрдлрд░ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЕрд▓реНрдлрд╛ рдорд╛рди рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

рдзреБрдВрдзрд▓рд╛ (рдзреБрдВрдзрд▓рд╛)



SSAO рдлреНрд░реЗрдо рдмрдлрд░ рдХреА рдмрдирд╛рд╡рдЯ рдереЛрдбрд╝рд╛ рд╢реЛрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЪреМрд░рд╕рд╛рдИ рдХреЗ рд▓рд┐рдП рдзреБрдВрдзрд▓рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

  // ... for (int i = 0; i < size2; ++i) { x = size - xCount; y = yCount - size; result += texture ( ssaoTexture , texCoord + vec2(x * parameters.x, y * parameters.x) ).rgb; xCount -= 1; if (xCount < countMin) { xCount = countMax; yCount -= 1; } } result = result / size2; // ... 

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ред X рдПрдХ рдЕрд▓рдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред

рдкрд░рд┐рд╡реЗрд╢ рдХрд╛ рд░рдВрдЧ


  // ... vec2 ssaoBlurTexSize = textureSize(ssaoBlurTexture, 0).xy; vec2 ssaoBlurTexCoord = gl_FragCoord.xy / ssaoBlurTexSize; float ssao = texture(ssaoBlurTexture, ssaoBlurTexCoord).r; vec4 ambient = p3d_Material.ambient * p3d_LightModel.ambient * diffuseTex * ssao; // ... 

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

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



рдХреНрд╖реЗрддреНрд░ рдХреА рдЧрд╣рд░рд╛рдИ



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

рдзреНрдпрд╛рди рдореЗрдВ


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

рдзреНрдпрд╛рди рд╕реЗ рдмрд╛рд╣рд░


  // ... vec4 result = vec4(0); for (int i = 0; i < size2; ++i) { x = size - xCount; y = yCount - size; result += texture ( blurTexture , texCoord + vec2(x * parameters.x, y * parameters.x) ); xCount -= 1; if (xCount < countMin) { xCount = countMax; yCount -= 1; } } result = result / size2; // ... 

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

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ред X рдПрдХ рдЕрд▓рдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред

рдорд┐рд╢реНрд░рдг




  // ... float focalLengthSharpness = 100; float blurRate = 6; // ... 

рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред focalLengthSharpness рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рджреГрд╢реНрдп рдлреЛрдХрд▓ рд▓рдВрдмрд╛рдИ рдореЗрдВ defocused рд╣реЛрдЧрд╛ред focalLengthSharpness рдЫреЛрдЯреА focalLengthSharpness , focalLengthSharpness рд╣реА рдЬреНрдпрд╛рджрд╛ focalLengthSharpness рд╕реАрди рдлреЛрдХрд▓ рд▓реЗрдВрде рдкрд░ рд╣реЛрдВрдЧреЗред рдзреБрдВрдзрд▓рд╛ рд╣реЛ рдЬрд╛рдирд╛ рдлреЛрдХрд▓ рд▓рдВрдмрд╛рдИ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдкрд░ рджреГрд╢реНрдп рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдиреЗ рдХреА рдЧрддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред blurRate рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рдлреЛрдХрд╕ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд░ рдЬрд╛рддреЗ рд╕рдордп рджреГрд╢реНрдп рдЙрддрдирд╛ рд╣реА рдзреБрдВрдзрд▓рд╛ рд╣реЛрдЧрд╛ред

  // ... vec4 focusColor = texture(focusTexture, texCoord); vec4 outOfFocusColor = texture(outOfFocusTexture, texCoord); // ... 

рд╣рдореЗрдВ рдлрд╝реЛрдХрд╕ рдореЗрдВ рдФрд░ рдбрд┐рдлреЛрдХрд╕ рдХреА рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ рд░рдВрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

  // ... vec4 position = texture(positionTexture, texCoord); // ... 

рд╣рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЬрдЧрд╣ рдореЗрдВ рд╢реАрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдЙрд╕ рдлреНрд░реЗрдо рдмрдлрд╝рд░ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдХреА рдмрдирд╛рд╡рдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ SSAO рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

  // ... float blur = clamp ( pow ( blurRate , abs(position.y - focalLength.x) ) / focalLengthSharpness , 0 , 1 ); // ... fragColor = mix(focusColor, outOfFocusColor, blur); // ... 

рдФрд░ рдпрд╣рд╛рдВ рднреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдХреЗ рдХрд░реАрдм blur, рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ outOfFocusColorред рд╢реВрдиреНрдп рдХреЗ рдореВрд▓реНрдп рдХрд╛ blurрдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд╣реИред blur >= 1рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ defocused рд╣реИред

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



posterization



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

  // ... float levels = 8; // ... 

рдЖрдк рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЙрддрдиреЗ рд╣реА рдЕрдзрд┐рдХ рдлреВрд▓ рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред

  // ... vec4 texColor = texture(posterizeTexture, texCoord); // ... 

рд╣рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд░рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

  // ... vec3 grey = vec3((texColor.r + texColor.g + texColor.b) / 3.0); vec3 grey1 = grey; grey = floor(grey * levels) / levels; texColor.rgb += (grey - grey1); // ... 

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

  // ... fragColor = texColor; // ... 

рдЯреБрдХрдбрд╝рд╛ рдХреЗ рд░рдВрдЧ рдХреЛ рдЗрдирдкреБрдЯ рд░рдВрдЧ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

рд╕реЗрд▓ рд╢реЗрдбрд┐рдВрдЧ



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

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



рдкрд┐рдХреНрд╕реЗрд▓реЗрд╢рди



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

  // ... int pixelSize = 5; // ... 

рдЖрдк рдкрд┐рдХреНрд╕реЗрд▓ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЫрд╡рд┐ рдЙрддрдиреА рд╣реА рдХрдард┐рди рд╣реЛрдЧреАред



  // ... float x = int(gl_FragCoord.x) % pixelSize; float y = int(gl_FragCoord.y) % pixelSize; x = floor(pixelSize / 2.0) - x; y = floor(pixelSize / 2.0) - y; x = gl_FragCoord.x + x; y = gl_FragCoord.y + y; // ... 

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

  // ... fragColor = texture(pixelizeTexture, vec2(x, y) / texSize); // ... 

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

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



рдкреИрдирд╛



рдкреИрдирд╛рдкрди рдкреНрд░рднрд╛рд╡ (рдкреИрдирд╛рдкрди) рдЫрд╡рд┐ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдкрд░реАрддрддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдХрд╛рдо рдЖрддрд╛ рд╣реИ рдЬрдм рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрд╣реБрдд рдирд░рдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

  // ... float amount = 0.8; // ... 

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

  // ... float neighbor = amount * -1; float center = amount * 4 + 1; // ... 

рдЖрд╕рдиреНрди рдЕрдВрд╢реЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ amount * -1ред рд╡рд░реНрддрдорд╛рди рдЯреБрдХрдбрд╝рд╛ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ amount * 4 + 1ред

  // ... vec3 color = texture(sharpenTexture, vec2(gl_FragCoord.x + 0, gl_FragCoord.y + 1) / texSize).rgb * neighbor + texture(sharpenTexture, vec2(gl_FragCoord.x - 1, gl_FragCoord.y + 0) / texSize).rgb * neighbor + texture(sharpenTexture, vec2(gl_FragCoord.x + 0, gl_FragCoord.y + 0) / texSize).rgb * center + texture(sharpenTexture, vec2(gl_FragCoord.x + 1, gl_FragCoord.y + 0) / texSize).rgb * neighbor + texture(sharpenTexture, vec2(gl_FragCoord.x + 0, gl_FragCoord.y - 1) / texSize).rgb * neighbor ; // ... 

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

  // ... fragColor = vec4(color, texture(sharpenTexture, texCoord).a); // ... 

рдпрд╣ рд░рд╛рд╢рд┐ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЕрдВрддрд┐рдо рд░рдВрдЧ рд╣реИред

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



рдлрд┐рд▓реНрдо рдХрд╛ рджрд╛рдирд╛



рдлрд┐рд▓реНрдо рдХрд╛ рджрд╛рдирд╛ (рдЫреЛрдЯреА рдЦреБрд░рд╛рдХ рдореЗрдВ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдирд╣реАрдВ) рдпрдерд╛рд░реНрдерд╡рд╛рдж рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рддрдХ рдЕрджреГрд╢реНрдп рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпреЗ рдРрд╕реА рдЦрд╛рдорд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдбрд┐рдЬрд┐рдЯрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддреА рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд┐рд▓реНрдо рдЕрдирд╛рдЬ рдЖрдорддреМрд░ рдкрд░ рдЕрдВрддрд┐рдо рдкреНрд░рднрд╛рд╡ рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдореВрд▓реНрдп


  // ... float amount = 0.1; // ... 

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

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрдордХ


 // ... uniform float osg_FrameTime; //... float toRadians = 3.14 / 180; //... float randomIntensity = fract ( 10000 * sin ( ( gl_FragCoord.x + gl_FragCoord.y * osg_FrameTime ) * toRadians ) ); // ... 

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

 Time Since F1 = 00 01 02 03 04 05 06 07 08 09 10 Frame Number = F1 F3 F4 F5 F6 osg_FrameTime = 00 02 04 07 08 

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

  // ... ( gl_FragCoord.x + gl_FragCoord.y * 8009 // Large number here. // ... 

рд╕реНрдерд┐рд░ рдЕрдирд╛рдЬ рдХреЗ рд▓рд┐рдП, рдлрд┐рд▓реНрдореЛрдВ рдХреЛ osg_FrameTimeрдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдкреИрдЯрд░реНрди рджреЗрдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред



  // ... * sin ( ( gl_FragCoord.x + gl_FragCoord.y * someNumber // ... 

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

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


рдмреЗрд╢рдХ, рдЖрдк рд╕рдордиреНрд╡рдп рдЧреБрдгрдХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдмрд╛рд░рд┐рд╢ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрд╖рд╛ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ sinрдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ osg_FrameTimeред

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

 input = (gl_FragCoord.x + gl_FragCoord.y * osg_FrameTime) * toRadians frame(10000 * sin(input)) = fract(10000 * sin(6.977777777777778)) = fract(10000 * 0.6400723818964882) = 

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

 fract(10000 * sin(6.977777777777778)) = fract(10000 * 0.6400723818964882) = fract(6400.723818964882) = 0.723818964882 

sinрд╕рд╛рде fractрдореЗрдВ рдПрдХ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 >>> [floor(fract(4 * sin(x * toRadians)) * 10) for x in range(0, 10)] [0, 0, 1, 2, 2, 3, 4, 4, 5, 6] >>> [floor(fract(10000 * sin(x * toRadians)) * 10) for x in range(0, 10)] [0, 4, 8, 0, 2, 1, 7, 0, 0, 5] 

рдкрд╣рд▓реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рджреЗрдЦреЗрдВ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реА рдкрд░ред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреИрдЯрд░реНрди рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреВрд╕рд░реЗ рдореЗрдВ рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ fract(10000 * sin(...))рдирд┐рд░реНрдзрд╛рд░рдХ рд╣реИ, рдкреИрдЯрд░реНрди рдХреЛ рдмрд╣реБрдд рдХрдордЬреЛрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░рдХ sinрдкрд╣рд▓реЗ 1, рдлрд┐рд░ 10, рдлрд┐рд░ 100 рдФрд░ рдлрд┐рд░ 1000 рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рдЧреБрдгрдХ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, sinрдкреИрдЯрд░реНрди рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдХреЛрдб sinрдХреЛ 10,000 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЦреБрд╢рдмреВ рдХрд╛ рд░рдВрдЧ


  // ... vec2 texSize = textureSize(filmGrainTexture, 0).xy; vec2 texCoord = gl_FragCoord.xy / texSize; vec4 color = texture(filmGrainTexture, texCoord); // ... 

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

  // ... amount *= randomIntensity; color.rgb += amount; // ... 

рдореВрд▓реНрдп рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрдордХ рдореЗрдВ рдмрджрд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рд░рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

  // ... fragColor = color; // ... 

рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд░рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИ

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



рдзрдиреНрдпрд╡рд╛рдж


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


All Articles