рдПрдХ рдХрдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдВрдЪрд▓ рдкрд╛рда рдбреНрд░рд╛ред

рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреЗ рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ , Android рдХреЗ рд▓рд┐рдП OpenGL рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЛрд╕реНрдЯрдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд, рдореИрдВрдиреЗ "рд╣рдо рдмрд╛рдж рдореЗрдВ рдмрдзрд╛рдИ рдкрд╛рда рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред

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

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рда


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

рдмрд┐рдЯрдореИрдк рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:

int width = screenWidth, height = screenHeight, fontSize = (int) (screenHeight / 8); // Create an empty, mutable bitmap Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); // get a canvas to paint over the bitmap Canvas canvas = new Canvas(bitmap); bitmap.eraseColor(Color.BLACK); // Draw the text Paint textPaint = new Paint(); textPaint.setTextSize(fontSize); textPaint.setAntiAlias(false); textPaint.setARGB(0xff, 0xff, 0xff, 0xff); textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setTypeface(Typeface.SANS_SERIF); // draw the text centered canvas.drawText(",", width / 2, height / 4, textPaint); canvas.drawText("!", width / 2, height / 2, textPaint); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); bitmap.recycle(); 

рдпрд╣рд╛рдБ, рд╕реНрдХреНрд░реАрдирд╡рд┐рдж рдФрд░ рд╕реНрдХреНрд░реАрдирд╣рд╛рдЗрдЯ рддрд░реНрдХ рд╕реЗ рдирд┐рдХрд▓реЗ рд╣реИрдВ, рдЬреЛ рд░реЗрдВрдбрд░рд░ рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рдСрдирд░рдлреЗрд╕рдЪреЗрдВрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдореМрдЬреВрдж рдкреЗрдиреЛрд▓реНрдЯрд┐рдореЗрдЯ рд▓рд╛рдЗрди рдХреЛ рдкреИрдХреНрдб рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓реАред рдХрд╛рд▓реЗ рдбреЙрдЯреНрд╕ (рдкреГрд╖реНрдарднреВрдорд┐) рдЗрд╕рдореЗрдВ 0xff000000 рд╣реИрдВ, рд╕рдлреЗрдж 0xffffffff (рдЙрдЪреНрдЪрддрдо рдмрд╛рдЗрдЯ рдЕрд▓реНрдлрд╝рд╛ рдЕрд▓реНрдлрд╛ рд╣реИ)ред

рд╡реИрд╕реЗ, рдпрджрд┐ рд╣рдо рдЗрд╕ рдкрд╛рда рдХреЛ рдПрдХ рдмрдирд╛рд╡рдЯ рдкрд░ рдлреИрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдЯрдореИрдк.рдХреНрд░реАрд▓ () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ:

  GLES20.glGenTextures(1, textures, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); // Use the Android GLUtils to specify a two-dimensional texture image from our bitmap GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 

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

  private final int mParticles = 1200; private int glParticleVB; ... int colored = 0; float[] cx = new float[width * height]; float[] cy = new float[width * height]; for (int y = 0, idx = 0; y < height; y++) for (int x = 0; x < width; x++) if ((pixels[idx++] & 0xffffff) != 0) { cx[colored] = x / (float)width; cy[colored] = y / (float)height; colored++; } float[] particleBuf = new float[3 * mParticles]; for (int i = 0, idx = 0; i < mParticles; i++, idx += 3) { int n = (int) (Math.random() * colored); particleBuf[idx + 0] = cx[n] * 2 - 1; particleBuf[idx + 1] = 1 - cy[n] * 2; particleBuf[idx + 2] = (float) Math.random(); } glParticleVB = createBuffer(particleBuf); 

рдХрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрдВрдЦ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ "рдЪрд░рдг рдмрджрд▓рд╛рд╡" рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ Y- рд╕рдордиреНрд╡рдп рдЙрд▓рдЯрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ OpenGL рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рдиреАрдЪреЗ рд╕рдордиреНрд╡рдп "-1" рд╣реИ рдФрд░ рд╢реАрд░реНрд╖ "+1" рд╣реИ, рдЬрдмрдХрд┐ рдмрд┐рдЯрдореИрдк рдореЗрдВ рдЪрд┐рддреНрд░ рдХрд╛ рд╢реАрд░реНрд╖ "0" рд╣реИ рдФрд░ рдиреАрдЪреЗ "рдКрдВрдЪрд╛рдИ" рд╣реИред ред

рдХрдг рдмрдирд╛рд╡рдЯ


рдЕрдм рдХрдг рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВред рдореИрдВрдиреЗ рдРрд╕реА рддрд╕реНрд╡реАрд░ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдХреЗрд╡рд▓ рдпрд╣ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЪрд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд░рдЦрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ Res / drawable рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ particle.png рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рдВрд╕рд╛рдзрди рд╕реЗ рдмрдирд╛рд╡рдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

  private int particleTex; ... public static int loadTexture(final Context context, final int resourceId) { final int[] textureHandle = new int[1]; GLES20.glGenTextures(1, textureHandle, 0); if (textureHandle[0] != 0) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; // No pre-scaling // Read in the resource final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options); // Bind to the texture in OpenGL GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]); // Set filtering 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); // Load the bitmap into the bound texture. GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); // Recycle the bitmap, since its data has been loaded into OpenGL. bitmap.recycle(); } return textureHandle[0]; } ... particleTex = loadTexture(mContext, R.drawable.particle); 

рдпрд╣рд╛рдБ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд░реЗрдВрдбрд░рд░ рд╡рд░реНрдЧ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рд╕рдордп mContext рдХреЛ рдмрдЪрд╛рдпрд╛ рдерд╛ред

shaders


рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛: рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЛ тАЛтАЛ"рд╕реНрдкрдВрджрд┐рдд" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рд╡реГрджреНрдзрд┐ рдФрд░ рдЕрдиреБрдмрдВрдз, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╕реБрдзрд╛рд░ рдЬреЛрдбрд╝рд╛: рдЬрдм рдХрдг рдХрд╛ рдЖрдХрд╛рд░ рдЕрдзрд┐рдХрддрдо 3/4 рддрдХ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд░рдВрдЧ рд╕рдлреЗрдж рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдзрд┐рдХрддрдо рдмрд┐рдВрджреБ рдкрд░ рдРрд╕рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред

  private final String particleVS = "precision mediump float;\n" + "attribute vec4 vPosition;\n" + "attribute float vSizeShift;\n" + "uniform float uPointSize;\n" + "uniform float uTime;\n" + "uniform vec4 uColor;\n" + "varying vec4 Color;\n" + "void main() {\n" + " float Phase = abs(fract(uTime + vSizeShift) * 2.0 - 1.0);\n" + " vec4 pColor = uColor;\n" + " if (Phase > 0.75) {\n" + " pColor.y = (Phase - 0.75) * 4.0;\n" + " };\n" + " Color = pColor;\n" + " gl_PointSize = uPointSize * Phase;\n" + " gl_Position = vPosition;\n" + "}\n"; private final String particleFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "varying vec4 Color;\n" + "void main()\n" + "{\n" + " gl_FragColor = texture2D(uTexture0, gl_PointCoord) * Color;\n" + "}\n"; 

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдХрд╛ рд╢реАрд░реНрд╖ рд╢реЗрдбрд░ рдХрдг рдЖрдХрд╛рд░ рдФрд░ рд░рдВрдЧ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрдмрдХрд┐ рдЯреБрдХрдбрд╝рд╛ shader рдХреЗрд╡рд▓ gl_PointCoord рд╕рд┐рд╕реНрдЯрдо рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рд╡рдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ vSizeShift рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ 0 рд╕реЗ 1 рддрдХ рдХреА рд╕реАрдорд╛ рд╣реИ, рдЬрдм uTime рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХрдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рдЪрд░рдг рдХрд╛ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЪреВрдВрдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рдВрдЧ рдмреИрдВрдЧрдиреА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╕рдлреЗрдж рд░рдВрдЧ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗрд╡рд▓ рд╣рд░реЗ рдШрдЯрдХ рдХреЗ рдХрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ, рдХрдг рдХрд╛ рд░рдВрдЧ рдФрд░ рдЙрд╕рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВ - рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рдХреЗрд╡рд▓ рд╢реЗрдбреНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ (рдлрд┐рд░ рд╕реЗ, рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕рдВрдХрд▓рди рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ):

  private int mPProgram; private int maPPosition; private int maPSizeShift; private int muPPointSize; private int muPTime; private int muPTexture; private int muPColor; ... mPProgram = Compile(particleVS, particleFS); maPPosition = GLES20.glGetAttribLocation(mPProgram, "vPosition"); maPSizeShift = GLES20.glGetAttribLocation(mPProgram, "vSizeShift"); muPPointSize = GLES20.glGetUniformLocation(mPProgram, "uPointSize"); muPTime = GLES20.glGetUniformLocation(mPProgram, "uTime"); muPTexture = GLES20.glGetUniformLocation(mPProgram, "uTexture0"); muPColor = GLES20.glGetUniformLocation(mPProgram, "uColor"); 

рдФрд░ рд╕рдм рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рддред

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛


рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдбреНрд░реЙ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

  private void DrawText() { GLES20.glUseProgram(mPProgram); GLES20.glDisable(GLES20.GL_DEPTH_TEST); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, particleTex); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glParticleVB); GLES20.glEnableVertexAttribArray(maPPosition); GLES20.glVertexAttribPointer(maPPosition, 2, GLES20.GL_FLOAT, false, 12, 0); GLES20.glEnableVertexAttribArray(maPSizeShift); GLES20.glVertexAttribPointer(maPSizeShift, 1, GLES20.GL_FLOAT, false, 12, 8); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); GLES20.glUniform1f(muPPointSize, 12); GLES20.glUniform4f(muPColor, 1, 0, 1, 1); GLES20.glUniform1i(muPTexture, 0); GLES20.glUniform1f(muPTime, (SystemClock.uptimeMillis() % 1000) / 1000.0f); GLES20.glDrawArrays(GLES20.GL_POINTS, 0, mParticles); GLES20.glDisableVertexAttribArray(maPPosition); GLES20.glDisableVertexAttribArray(maPSizeShift); } 

рдкрд░рд┐рдгрд╛рдо




рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдкрд░, рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ OpenGL ES 2.0 рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдореЗрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣реА рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рдВрдмреЗ рдмреНрд░реЗрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдПрдХ .apk рдлрд╝рд╛рдЗрд▓ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдирдП рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдпрджрд┐ рдореИрдВ рдХрд╛рд░реНрдб рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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


All Articles