рдПрдВрдбреНрд░реЙрдпрдбред рд╕рддрд╣

рддреНрдпрд╛рдЧ


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


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


рд╡рд┐рднрд┐рдиреНрди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ


рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ: рд╣рдо рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд▓реЗрдВрдЧреЗ, рдЙрд╕ рдкрд░ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдбреНрд░реЙрдмрд▓ рдУрд╡рд░рд▓реЗ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦреЗрдВред рдкреВрд░рд╛ рдХреЛрдб https://github.com/tttzof351/AndroidSurfaceExample/ рд╣реЛрдЧрд╛


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



рдорд▓реНрдЯреАрдкрд▓ рд╕рд░рдлреЗрд╕ рдУрд╡рд░рд▓реЗ


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


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


рдХреЛрдб рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


OpenGLExtarnalTexture.kt


val textures = IntArray(1) GLES20.glGenTextures(1, textures, 0) val textureId = textures[0] //    val textureWidth = ... val textureHeight = ... //  val surfaceTexture = SurfaceTexture(textureId) surfaceTexture.setDefaultBufferSize(textureWidth, textureHeight) //, surface  ""    val surface = Surface(surfaceTexture) 

XYZ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ


рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмрдирд╛рд╡рдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдУрдкреЗрдирдЧреНрд▓ рдореЗрдВ рд╕рдордиреНрд╡рд┐рдд рдЧреНрд░рд┐рдб рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рд╣реИ: рдЗрд╕рдХрд╛ рдХреЗрдВрджреНрд░ рджреГрд╢реНрдп (рдЦрд┐рдбрд╝рдХреА) рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реАрдорд╛рдПрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН -1 рд╕реЗ 1 рддрдХред


рдЗрд╕ рджреГрд╢реНрдп рдореЗрдВ, рд╣рдо рджреЛ рдЖрдпрддреЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдХрд╛рдо рд╡рд┐рдорд╛рди рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА z рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ 0f рдкрд░ рд╕реЗрдЯ рд╣реИрдВ) - рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рдо рдПрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рд╣рдо рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд▓рд┐рдП рдиреАрд▓реЗ рд░рдВрдЧ рдореЗрдВ:


рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:



 fullscreenTexture = floatArrayOf( // X, Y, Z -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, ) smallTexture = floatArrayOf( // X, Y, Z 0.3f, 0.3f, 0.0f, 0.8f, 0.3f, 0.0f, 0.3f, 0.8f, 0.0f, 0.8f, 0.8f, 0.0f ) 

рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ


рдХреНрдпрд╛ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдирд╣реАрдВ :(


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


рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рд╣рдо рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЫрд╡рд┐ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдХреИрдорд░рд╛ рд╣рдореЗрдВ рдПрдХ рдЙрд▓реНрдЯреЗ рдФрд░ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЫрд╡рд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рд╣рдо рдХреЗрд╡рд▓ рд╕рд╣реА-рдКрдкрд░реА рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЫрд╡рд┐ рдХреЗ рдЕрдХреНрд╖рд╛рдВрд╢ рдФрд░ рдКрдВрдЪрд╛рдИ рдореЗрдВ 0.8 рд▓реЗрддреЗ рд╣реИрдВред


рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ - рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рдкреВрд░реЗ рджреГрд╢реНрдп рдХреЛ рднрд░ рджреЗрдЧрд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЦрд┐рдВрдЪрд╛рд╡ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рдо рдПрдХ рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХреИрдорд░рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдереЗ, рддреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЖрдХрд╛рд░ (рдкреНрд░рддреНрдпреЗрдХ рддрд░рдл 2) рдкрд╛рд░рдВрдкрд░рд┐рдХ 1080x1920 рддрдХ рдлреИрд▓ рдЬрд╛рдПрдВрдЧреЗред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рджреГрд╢реНрдп рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдРрд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЕрдиреБрдкрд╛рдд рдХреИрдорд░реЗ рдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ - рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдКрдкрд░реА рджрд╛рдПрдВ рдмрд┐рдВрджреБ (1, 1, 0) рдХреЛ рдпреВрд╡реА рд╕рдордиреНрд╡рдп (0, 0) рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ (0.8f, 0.8f), рдЖрджрд┐ред



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо XYZ рдФрд░ рдпреВрд╡реА рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


 // X, Y, Z, U, V -1.0f, -1.0f, 0.0f, 0.8f, 0.8f, 1.0f, -1.0f, 0.0f, 0.8f, 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.8f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f 

рдпрджрд┐ рдХреИрдорд░реЗ рд╕реЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмреАрдЪ рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рд╢реБрд░реВ рдореЗрдВ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл 0.8f рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рд╣рдо рдХреНрдпрд╛ рдЦрд╛рдПрдВрдЧреЗ рд╣рдо 1 рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ? рд╣рдордиреЗ рдУрдкрдирдЬреАрдПрд▓ рдХреЛ рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╛рд╕ рдХреА рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдЕрдВрдХ рдорд┐рд▓реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдЗрд╕реА рдЕрдХреНрд╖ рдкрд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо "рдзрд╛рд░рд┐рдпреЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред


рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐: рдпрджрд┐ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдЫрд╡рд┐ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд / рдХрд╛рдЯ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣рдорд╛рд░реА рдкрд╕рдВрдж рд╣реИрдВ!


рд╣рдорд╛рд░реЗ рдмрдирд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░реЗрдВред



 fullscreenTexture = floatArrayOf( // X, Y, Z, U, V -1.0f, -1.0f, 0.0f, 1f, 0f, 1.0f, -1.0f, 0.0f, 0f, 0f, -1.0f, 1.0f, 0.0f, 1f, 1f, 1.0f, 1.0f, 0.0f, 0f, 1f ) smallTexture = floatArrayOf( // X, Y, Z, U, V 0.3f, 0.3f, 0.0f, 0f, 0f, 0.8f, 0.3f, 0.0f, 1f, 0f, 0.3f, 0.8f, 0.0f, 0f, 1f, 0.8f, 0.8f, 0.0f, 1f, 1f ) 

shaders


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


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


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рд╢реЗрдб рд╣реИрдВ - рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдЯреБрдХрдбрд╝рд╛ред


рдкрд╣рд▓рд╛ (рд╡рд░реНрдЯреЗрдХреНрд╕) рд╣рдорд╛рд░реЗ рд╕рд┐рд░реЛрдВ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рд╡рд╛рдИрдЬреЗрдб / рдпреВрд╡реА рдХреЛ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдЯреНрд░рд┐рд╕реЗрд╕ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рд╡реЗрд░рд┐рдПрдмрд▓ gl_Position рдореЗрдВ рднрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдорд╛рд░реА рдмрдирд╛рд╡рдЯ рдХреА рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред


рджреВрд╕рд░рд╛ (рдЯреБрдХрдбрд╝рд╛) рдЫрд╡рд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде gl_FragColor рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрд▓: рд╡рд░реНрдЯрд┐рдХрд▓ рд╢реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдХреЗ рд╡реИрд░рд┐рдПрдмрд▓ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрддреЛрдВ рдореЗрдВ рднрд░рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН:


  • MVPMatrix -> uMVPMatrix
  • рдЯреЗрдХреНрд╕рдореИрдЯреНрд░рд┐рдХреНрд╕ -> рдпреВрдЯреЗрдХреНрд╕рдореИрдЯреНрд░рд┐рдХреНрд╕
  • рд╣рдорд╛рд░реЗ XYZ рд╢реАрд░реНрд╖ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ -> aPosition
  • рдпреВрд╡реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ -> aTextureCoord

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


 val vertexShader = """ uniform mat4 uMVPMatrix; uniform mat4 uTexMatrix; attribute vec4 aPosition; attribute vec4 aTextureCoord; varying vec2 vTextureCoord; void main() { gl_Position = uMVPMatrix * aPosition; vTextureCoord = (uTexMatrix * aTextureCoord).xy; } """ val fragmentShader = """ #extension GL_OES_EGL_image_external : require precision mediump float; varying vec2 vTextureCoord; uniform samplerExternalOES sTexture; void main() { gl_FragColor = texture2D(sTexture, vTextureCoord); } """ 

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


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

рдХреИрд╕реЗ рдПрдХ shader рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреА рдЖрдИрдбреА (рдкреЙрдЗрдВрдЯрд░) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реЛрдЧреА:


 val aPositionHandle = GLES20.glGetAttribLocation(programId, "aPosition") 

рдЕрдм рдЗрд╕ рдЖрдИрдбреА рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 //      floatbuffer val verticesBuffer = ByteBuffer.allocateDirect( fullscreenTexture.size * FLOAT_SIZE_BYTES ).order( ByteOrder.nativeOrder() ).asFloatBuffer() verticesBuffer.put(fullscreenTexture).position(0) /*    -  XYZ   0 .       id      ,     ,               - 5  - XYZUV,  4 - -   float */ verticesBuffer.position(0) GLES20.glVertexAttribPointer( aPositionHandle, 3, GLES20.GL_FLOAT, false, 5 * 4, verticesBuffer ) 

рд╕реАрдзреА рдбреНрд░рд╛рдЗрдВрдЧ


рдЬрдм рд╣рдордиреЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╢реЗрдбреНрд╕ рдХреЛ рднрд░ рджрд┐рдпрд╛, рддреЛ рд╣рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЛ рдЫрд╡рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдХреЛ рдЕрдкрдирд╛ рд╕рд┐рд░рд╛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП:


 fun updateFrame(...) { ... surfaceTexture.updateTexImage() GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4) } 

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдУрдкрдирдЬреАрдПрд▓ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдХрд╛рдо рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗ - рд╕реАрдзреЗ рджреГрд╢реНрдп рдФрд░ рдмрдирд╛рд╡рдЯ:


OpenGLExternalTexture.kt


 class OpenGLExternalTexture(verticesData: FloatArray, ...) { val surfaceTexture: SurfaceTexture val surface: Surface init { // ,    . } ... fun updateFrame(aPositionHandle: Int, ...) {...} // ,   fun release() {...} //   } 

OpenGLScene.kt


 class OpenGLScene( sceneWidth: Int, sceneHeight: Int, ... ) { val fullscreenTexture = OpenGLExternalTexture(...) val smallTexture = OpenGLExternalTexture(..) val aPositionHandle: Int ... init { // ,        . } fun updateFrame() { ... fullscreenTexture.updateFrame(aPositionHandle, ...) smallTexture.updateFrame(aPositionHandle, ...) } fun release() { fullscreenTexture.release() smallTexture.release() } } 

StateMachine / рд░рд╛рдЬреНрдп рдорд╢реАрди / рд░рд╛рдЬреНрдп рдорд╢реАрди


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


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реИ:


 imageView.setOnClickListener { loadImage { bitmap -> imageView.setBitmap(bitmap) } } 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ - рд╕реБрдВрджрд░ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:


 val uiMachine = UIMachine() imageView.setOnClickListener { uiMachine.send(Click(imageView)) } class UIMachine { var state: State = WaitClick() fun send(action: Action) = transition(action) private fun transition(action: Action) { val state = this.state when { state is WaitingClick && action is Click -> { this.state = WaitBitmap(imageView = action.imageView) loadImage { send(BitmapIsReady(bitmap = it)) } } state is WaitingBitmap && action is BitmapIsReady -> { this.state = WaitClick state.imageView.setImageBitmap(action.bitmap) } } } } sealed class State { object WaitingClick : State() class WaitingBitmap(val imageView: ImageView): State() } sealed class Action { class Click(val imageView: ImageView): Action() class BitmapIsReady(val bitmap: Bitmap): Action() } 

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



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


StateMachine рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдПрдБ:


 interface Action interface State interface StateMachine<S : State, A : Action> { var state: S fun transition(action: A) fun send(action: A) } 

GLSurfaceView


Android рдореЗрдВ OpenGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ GLSurfaceView рд╡рд░реНрдЧ рд╣реИ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ GLSurfaceView :: onResume / onPause рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрдн / рд░реЛрдХ рджреЗрддрд╛ рд╣реИред


рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ 16: 9 рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ


рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реА рдПрдХ рдЕрд▓рдЧ рдХреЙрд▓рдмреИрдХ - GLSurfaceView.Renderer рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
StateMachine рдореЗрдВ рд▓рдкреЗрдЯрдХрд░, рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИ:


GLSurfaceMachine.kt


 class GLSurfaceMachine: StateMachine<GLSurfaceState, GLSurfaceAction> { override var state: GLSurfaceState = WaitCreate() override fun send(action: GLSurfaceAction) = transition(action) override fun transition(action: GLSurfaceAction) { val state = this.state when { state is WaitCreate && action is Create -> { this.state = WaitSurfaceReady(...) this.state.glSurfaceView?.setRenderer(object :Renderer { override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) send(SurfaceReady(width, height, gl)) } override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) { } override fun onDrawFrame(gl: GL10?) { send(Draw) } }) } state is WaitSurfaceReady && action is SurfaceReady -> { val openGLScene = OpenGLScene(width, height) this.state = DrawingAvailable(openGLScene, ...) } state is DrawingAvailable && action is Draw -> { state.openGLScene.updateFrame() } state !is WaitCreate && action is Stop -> { state.uiHolder.glSurfaceView?.onPause() state.uiHolder.openGLScene?.release() this.state = WaitSurfaceReady() } state is WaitSurfaceReady && action is Start -> { state.uiHolder.glSurfaceView?.onResume() } } } } ... val glSurfaceMachine = GLSurfaceMachine() val glSurfaceView = findViewById(R.id.gl_view) glSurfaceView.layoutParams.width = width glSurfaceView.layoutParams.height = ((16f/9f) * width).toInt() glSurfaceMachine.send(GLSurfaceAction.Create(glSurfaceView, ...)) 

рдЖрдЗрдП рдПрдХ рд╕рдВрдХреНрд░рдордг рдЪрд┐рддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ:



рдЕрдм рд╣рдорд╛рд░рд╛ рдХреЛрдб рд╕реНрдХреНрд░реАрди рдкрд░ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдпрд╣ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ - рд╣рдо рдХрд╛рд▓реА рд╕реНрдХреНрд░реАрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдЗрд╕ рддрдереНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рд╕рд░рдлреЗрд╕ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рддрдХ рдЫрд╡рд┐ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЪрд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ - рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ CanrawDrawable рдмрдирд╛рдПрдВ:


CanvasDrawable.kt


 class CanvasDrawable : Drawable() { private val backgroundPaint = Paint().apply { ... } private val circlePaint = Paint().apply { ... } override fun draw(canvas: Canvas) { canvas.drawRect(bounds, backgroundPaint) val width = bounds.width() val height = bounds.height() val posX = ... val posY = ... canvas.drawCircle(posX, posY, 0.1f * width, circlePaint) } ... } 

рдЕрдм рд╣рдо GLSurfaceMachine рдореЗрдВ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рдХреЗ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреИрдирд╡рд╛рд╕ рдкрд░ рд╕рдВрдЧрдд рд╣реИ рдЬреЛ рдЗрд╕реА рдмрдирд╛рд╡рдЯ рдХреА рд╕рддрд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:


 state is DrawingAvailable && action is Draw -> { val canvasDrawable = state.canvasDrawable val smallTexture = state.openGLScene.smallTexture val bounds = canvasDrawable.bounds val canvas = smallSurface.lockCanvas(bounds) canvasDrawable.draw(canvas) smallSurface.unlockCanvasAndPost(canvas) state.openGLScene.updateFrame() } 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:



рдХреИрдорд░рд╛ рдПрдкреАрдЖрдИ V2


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


рдЖрдЗрдП рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ:


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

 val manager = getSystemService(Context.CAMERA_SERVICE) as CameraManager var resultCameraId: String? = null var resultSize: Size? = null for (cameraId in manager.cameraIdList) { val chars = manager.getCameraCharacteristics(cameraId) val facing = chars.get(CameraCharacteristics.LENS_FACING) ?: -1 if (facing == LENS_FACING_BACK) { val confMap = chars.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP ) val sizes = confMap?.getOutputSizes(SurfaceTexture::class.java) resultSize = findSize(sizes) resultCameraId = cameraId break } } resultCameraId?.let { cameraId -> manager.openCamera(cameraId, object : CameraDevice.StateCallback() { override fun onOpened(camera: CameraDevice) { //Success open camera ... } }) } 

  • рдПрдХ рдЦреБрд▓рд╛ рдХреИрдорд░рд╛ рд╣реЛрдиреЗ рд╕реЗ, рд╣рдо рдЫрд╡рд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдбрд╝рддреЗ рд╣реИрдВред WaitingSurface рд╕реНрдерд┐рддрд┐
  • рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CameraDevice рд╣реИ, рд╕рд░рдлреЗрд╕, рд╣рдореЗрдВ рдПрдХ рд╕рддреНрд░ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреИрдорд░рд╛ рдЕрдВрддрддрдГ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗред WaitingSession рд╕реНрдерд┐рддрд┐

 cameraDevice.createCaptureSession( arrayListOf(surface), object : CameraCaptureSession.StateCallback() { override fun onConfigured(session: CameraCaptureSession) { send(CameraAction.SessionReady(session)) } }, handler ) 

  • рдЕрдм рд╣рдо рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐

 val request = cameraDevice.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW ).apply { addTarget(surface) } session.setRepeatingRequest( request.build(), object : CameraCaptureSession.CaptureCallback() {...} handler ) 

рд╣рдо рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:


CameraMachine.kt




MediaCodec


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


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдмрд╛рдЗрдЯрдмрдлрд╝рд░ рдЖрдорддреМрд░ рдкрд░ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЖрдк рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ MediaCodec :: createInputSurface рд╣рдореЗрдВ рд▓реМрдЯрд╛рдПрдЧрд╛, рдЗрд╕ рдкрд░ рд╣рдореЗрдВ рдЙрди рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкреНрд░рд▓реЗрдЦрди рд╣рдореЗрдВ gpu рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреЗрдЬреА рд╕реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред )ред


рдЦреИрд░, рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рд╕рд░рдлреЗрд╕ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕реЗ рд╣рдордиреЗ GLSurfaceMachine рдореЗрдВ рд╕рд░реНрдлреЗрд╕ рдСрди рдореАрдбрд┐рдпрд╛рдХреЛрдб рд╕реЗ рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рднреВрддрд▓ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдЗрд╕рд╕реЗ рдХреБрдЫ рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рд╢рд░реНрдд рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ getBitmap / readImage / ...


рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ: рдореМрдЬреВрджрд╛ рдЬреАрдПрд▓ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдПрдХ рдирдпрд╛ рдмрдирд╛рдпреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдо рдореЗрдореЛрд░реА рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдмрдирд╛рд╡рдЯреЛрдВ рдХреЗ рдЖрдИрдбреА-рд╢реЗрдХрд┐рдиреНрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдереЗред рдлрд┐рд░ MediaCodec рд╕реЗ рдирдП GL рд╕рдВрджрд░реНрдн рдФрд░ рд╕рд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ EGLSurface - рдПрдХ рдСрдл-рд╕реНрдХреНрд░реАрди рдмрдлрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЕрдкрдиреА OpenGLScene рдХреНрд▓рд╛рд╕ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ, рд╣рдо рдлреНрд░реЗрдо рдХреЛ рдлрд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред


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


EncoderMachine.kt
EncoderHelper.kt



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


  • рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OpenGL рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдмреБрдирд┐рдпрд╛рджреА рдХреМрд╢рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
  • Android Media API рдХрд╛рдлреА рдирд┐рдореНрди-рд╕реНрддрд░ рдХрд╛ рд╣реИ, рдЬреЛ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдФрд░ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  • рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ API рдХреЛ StateMachines рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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


All Articles