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

рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд╕рдВрдХреНрд░рдордг - рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореАрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде:

рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП,
X рдФрд░
Y рд╕реЗ
Z рд╕рдордиреНрд╡рдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рд╣рдо
Y рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рд╣рдо рдПрдХ рд╕реНрдХреНрд░реАрди рд▓рдВрдмрд╡рдд рд╣реЛрдВрдЧреЗ) рдФрд░
Z (рдпрд╣ рджреГрд╢реНрдп рдХреА рдЧрд╣рд░рд╛рдИ рд╣реЛрдЧреА) рдХреЛ рдмрджрд▓рдХрд░ рдЙрдкрд░реЛрдХреНрдд рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВрдЧреЗред
рддрдХрдиреАрдХреА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ
рд╡рд┐рдЪрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрд╡рд╛рдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА
рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рдирд╣реАрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд╕рд╛рде рд╣реА рджреЛ рдмрдирд╛рд╡рдЯ: рдЧреНрд░рд╣ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирдХреНрд╢реЗ (рдореИрдВрдиреЗ рдкреГрдереНрд╡реА рдХреЗ рдЖрдХрд╛рд░ рдХреА рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛) 2048x1024) рдФрд░ рдмрдирд╛рд╡рдЯ рдирдХреНрд╢реЗ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдмрдирд╛рд╡рдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб, рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗ рдЧреЛрд▓рд╛рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЧрдгрд┐рдд рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ:
int texSize = 1024; double r = texSize * 0.5; int[] pixels = new int[texSize * texSize]; for (int row = 0, idx = 0; row < texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x <= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels[idx++] = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf[0]; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ
X рдФрд░
Y рдХреЛ рд░реЗрдВрдЬ [0..texSize] рд╕реЗ рд░реЗрдВрдЬ [-1..1] рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрдирд╛рд╡рдЯ
U рдФрд░
V рдХреЛ рдХреЛрд░реНрдбрд┐рдВрд╕ рд╕реЗ рд░реЗрдВрдЬ [0..255] рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реЗ рдХреНрд░рдорд╢рдГ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ 32-рдмрд┐рдЯ рдмрдирд╛рд╡рдЯ рдХреЗ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рдШрдЯрдХред рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ "рдЧрд╣рд░рд╛рдИ" (
Z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ) рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмреНрд▓реВ рдЪреИрдирд▓ рдЕрднреА рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИред рдмрд┐рд▓рд┐рдирд┐рдпрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рднреА рдЖрдХрд╕реНрдорд┐рдХ рдирд╣реАрдВ рд╣реИ: рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдпрд╣ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдкрдбрд╝реЛрд╕реА рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реИрдВ, рдмрд▓реНрдХрд┐ рддреЗрдЬ рдЫрд▓рд╛рдВрдЧ рдХреЗ рд╕рд╛рде), рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЧреЗ рдХреНрдпрд╛ рджрд┐рдЦрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реЛрдЧрд╛ред рд╣рд╛рдирд┐рдХрд╛рд░рдХред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдиреАрдЪреЗред

рджреЛрдиреЛрдВ рдмрдирд╛рд╡рдЯ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд┐рдХреНрд╕реЗрд▓ shader (рдпрд╣рд╛рдБ рдФрд░ рдиреАрдЪреЗ, рдЪрд┐рддреНрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ) рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "varying vec4 TexCoord0;\n" + "void main() {\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w > 0.0 ? 1.0 : 0.0));\n" + "}\n";
рдореИрдВ рджреГрд╢реНрдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ (рдФрд░, рдлрд┐рд░ рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рд╢реЗрдбрд░ рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рдЖрджрд┐рдо рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд, рд╢рд╛рдпрдж, рдпрд╣ рд╣реИ рдХрд┐ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХреЛ рдХреЗрд╡рд▓ рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рдХрд╛рд╢ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕рдкрд╛рдЯ, рдкреНрд▓рд╕ рдореИрдВ рдЕрдкрдиреА рдзреБрд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЧреНрд░рд╣ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реЛрдЯреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╣рдо shader рдореЗрдВ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдЗрд╕реЗ рд░реЗрдВрдЬ рдореЗрдВ рд╕рдордп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓ рджреЗрдВрдЧреЗ [0..1]), рдкреНрд▓рд╕ "рдЧрд╣рд░рд╛рдИ" (рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рд╕реЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд░рдВрдЧ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛) рдЬреЛрдбрд╝реЗрдВ:
private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "varying vec4 TexCoord0;\n" + "void main() {\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0 : 0.0));\n" + "}\n";
рд╡реИрд╕реЗ, рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╕реНрд╡реАрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ ... рдЖрда-рдмрд┐рдЯ, рдпрд╛ рдХреБрдЫ рдФрд░ред рдФрд░ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ: рд╣рдордиреЗ рдмрдирд╛рд╡рдЯ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ [0..255] (рд╕рд╛рдзрд╛рд░рдг рд░рдВрдЧ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдЙрдкрд▓рдмреНрдз) рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдмрдирд╛рд╡рдЯ рдореЗрдВ 256 рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдЕрдзрд┐рдХ (рдФрд░ рдЪреМрдбрд╝рд╛рдИ 512, рдЦрд╛рддреЗ рдореЗрдВ рд░реЛрдЯреЗрд╢рди рдореЗрдВ рдирд╣реАрдВ) рд╣реЛ рд╕рдХрддреА рд╣реИред рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо 10-рдмрд┐рдЯ рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдВрдХрд▓реНрдк рдмрдврд╝рд╛рдПрдБ
рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ: рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдХреБрдЫ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХреБрдЯрд┐рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрди рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рдерд╛ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реИрдХ рд╣реИред
рддреЛ, рдЕрдм рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдореЗрдВ рд╕реЗ рджреЛ рд░рдВрдЧ рдШрдЯрдХ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред 24 рдореЗрдВ рд╕реЗ 16 рдмрд┐рдЯреНрд╕ред рдЪрд▓реЛ, рдбреЗрдЯрд╛ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рдордиреНрд╡рдп рдореЗрдВ 12 рдмрд┐рдЯреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛ, рдЬреЛ рд╣рдореЗрдВ рдКрдВрдЪрд╛рдИ рдореЗрдВ 4096 рдкрд┐рдХреНрд╕рд▓ рддрдХ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдЪрдореБрдЪ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рддреАрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:
... long v = Math.round(4095 * theta / Math.PI); ... u = Math.round(4095 * phi / (2 * Math.PI)); ... pixels[idx++] = (int) ((a << 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
рдФрд░ 12-рдмрд┐рдЯ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рд╕реНрдХреАрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рдирдпрд╛ рд╢реЗрдбрд░ рд▓рд┐рдЦреЗрдВ (рдпрд╣ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рд╣реИ рдХрд┐ рдмрд┐рд▓рд┐рдирд┐рдпрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!):

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "varying vec4 TexCoord0;\n" + "void main() {\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = floor(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0 + uOffset,\n" + " (vOff.z * 16.0 + hiY) / 4095.0);\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0.0 ? 1.0 : 0.0));\n" + "}\n";
рдЦреИрд░, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реИ! рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ (рдЪреБрдЯрдХреА рдЬрд╝реВрдо рдФрд░ рдЙрдВрдЧрд▓реА рдШреБрдорд╛рдирд╛) рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдФрд░ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рджрд┐рдЦрд╛рдпрд╛, рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рднреА рдкреВрдЫрд╛ рдХрд┐ рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ рдХрд┐рддрдиреЗ, рдЙрдирдХреА рд░рд╛рдп рдореЗрдВ рддреНрд░рд┐рдХреЛрдг рдереЗред рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереЗ, рдФрд░ рд╕рд╡рд╛рд▓ рд╣реА рдПрдХ рдЧрдВрджреА рдЪрд╛рд▓ рдХрд╛ рд╕рдВрджреЗрд╣ рдкреИрджрд╛ рдХрд░рддрд╛ рдерд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдиреЗ "рдПрдХ" рдордЬрд╛рдХ рдХрд┐рдпрд╛, рдЬреЛ рд╕рдЪреНрдЪрд╛рдИ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдерд╛), рд▓реЗрдХрд┐рди рд╕рд╣реА рдЬрд╡рд╛рдм рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдерд╛ред рдФрд░ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдиреЗ рдкреВрдЫрд╛: рдПрдХ рдзреБрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЧреЛрд▓рд╛ рдХреНрдпреЛрдВ рдШреБрдорд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЭреБрдХрд╛ рд╣реБрдЖ рдирд╣реАрдВ? .. рд╣рдореНрдоред
рдЭреБрдХрд╛рд╡
рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдврд▓рд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдп рдЕрдШреБрд▓рдирд╢реАрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЛ рдСрдлрд╕реЗрдЯ
V рдХреЛ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рдордиреНрд╡рдп
U рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ: рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо
рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ: рд╣рдо рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕реНрдХреНрд░реАрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд░реЗрдВрдЬ [-1..1]), рдХреНрд╖реИрддрд┐рдЬ рдЕрдХреНрд╖ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реЛрдЯреЗрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдП
рдпреВрдЯрд┐рд▓реНрдЯ рдореЗрдВ рдЭреБрдХрд╛рд╡ рдХреЗ рдХреЛрдг рдХреЗ рд╕рд╛рдЗрди рдФрд░ рдХреЛрд╕рд╛рдЗрди
рд▓рд┐рдЦреЗрдВ ), рдФрд░ рдлрд┐рд░ рдирдП
рд╡рд╛рдИ рд╕рдордиреНрд╡рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдПред "рдШреБрдорд╛рдпрд╛ рд╣реБрдЖ"
Z рд╕рдордиреНрд╡рдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣рдо рдЧреЗрдВрдж рдХреА рдкреАрда рдХреЗ рд▓рд┐рдП рджреЗрд╢рд╛рдВрддрд░ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ)ред рд╕реНрдХреНрд░реАрди рд╕рдордиреНрд╡рдп
Z рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдПрдХ рд╣реА рдмрдирд╛рд╡рдЯ рд╕реЗ рджреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рдирдореВрдиреЗ рди рд╣реЛрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдпрд╣ рдЗрд╕рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛ред

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "uniform vec2 uTilt;\n" + "varying vec4 TexCoord0;\n" + "void main() {\n" + " float sx = 2.0 * TexCoord0.x - 1.0;\n" + " float sy = 2.0 * TexCoord0.y - 1.0;\n" + " float z2 = 1.0 - sx * sx - sy * sy;\n" + " if (z2 > 0.0) {;\n" + " float sz = sqrt(z2);\n" + " float y = (sy * uTilt.y - sz * uTilt.x + 1.0) * 0.5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0, vec2(TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255.0 + vec3(0.5, 0.5, 0.5);\n" + " float hiY = floor(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095.0,\n" + " (vOff.z * 16.0 + hiY) / 4095.0);\n" + " if (z < 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
рд╣реБрд░реНрд░реЗ, рдврд▓рд╛рди рдПрдХ рд╕рдлрд▓рддрд╛ рдереА! рдЧреЛрд▓рд╛рд░реНрдз рдХреА рд╕реАрдорд╛ рдкрд░ рдмрд╕ рдПрдХ рдЕрдЬреАрдм рд╕рд╛ рд╢реЛрд░ рд╣реИ, рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рддред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рд╕реАрдорд╛ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкрддрд╛ рдХрд░рдиреЗ рдХреА рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ (рд╕рд░реНрдХрд▓ рдкрд░ рдмрд┐рдВрджреБ рд╕реНрд╡рдпрдВ рдмрд╣реБрдд рдмрдбрд╝реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдПрдХ рдЯреЗрдХреНрд╕рд▓ рдПрдХ рдмрд▓реНрдХрд┐ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдлреИрд▓рддрд╛ рд╣реИ)ред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рджреЛ рдЙрддреНрдкрдиреНрди рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд░рд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрдк Google рдзрд░рддреА рдХреА рддрд░рд╣ рд╣реА рдЧреЗрдВрдж рдХреЛ рдЬрд╝реВрдо рдФрд░ рдЯрд░реНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рджреЛ рддреНрд░рд┐рдХреЛрдг рд╣реИрдВред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
рдЖрдк рд╕рдорд╛рдкреНрдд
.apk рдлрд╝рд╛рдЗрд▓ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рдХреЗ рд╕реНрд░реЛрдд
рд╡рд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз
рд╣реИрдВ ред
рдЕрджреНрдпрддрди: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрднреА рднреА рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╕рдЯреАрдХ рдмрдирд╛рд╡рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╕рд╛рде рд╣реА рдкреИрдЯрд░реНрди рдмрдирд╛рд╡рдЯ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рдЧреЛрд▓рд╛рдИ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрди рднреА рдХрд░рдирд╛ рдерд╛ред рдЕрдм рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд▓рдкреВрд░реНрд╡рдХ рд╕рдВрдХреБрдЪрд┐рдд рдмрдирд╛рд╡рдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред GitHub рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдирдИ .apk рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИрдВред
рдЕрджреНрдпрддрди 2: рдлрд┐рд░ рднреА, рдЧреЛрд▓рд╛рд░реНрдз рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реНрд░реЛрдд рдФрд░ рддреИрдпрд╛рд░ .apk рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмреЛрдирд╕ рдЬреЛрдбрд╝рд╛: рдЗрд╕ рдбреЗрдореЛ рдХрд╛ рд╡реЗрдмрд▓реЙрдЧ рд╕рдВрд╕реНрдХрд░рдг
рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред