рд╣рд╛рдп рд╣рдорд░!
рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╡рд╡реЗрдкреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдереАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИ: рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ рдореЗрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 1.0 / 2.0 рдХреЗ рд╕рд╛рде рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИрдВ, рд╡рд╣рд╛рдБ рд╣реИ ... рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ рдирд╣реАрдВ!
рдЖрдЬ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
Linderdaum Engine рдФрд░ GLSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдореЗрдВ Android рдХреЗ рд▓рд┐рдП LiveWallpaper рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рдЯреНрдпреВрдиреНрдб
рд▓рд┐рдВрдбрд░рдбреИрдо рдЗрдВрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, Habr├й рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдереА:
http://habrahabr.ru/post/121062/рд╣рдо рдПрдХ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
http://www.chromeexperiments.com/webgl рд╡реЗрдмрдЬреАрдПрд▓ рдкрд░ рдЫрд╡рд┐-рд╕реНрдерд╛рди рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕реЗрдЯ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡реЗрдмрдЬреАрдПрд▓ рдФрд░ рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 2 рд╢реЗрдб рд╕рдВрдЧрдд рд╣реИрдВ)ред
рдЖрдЗрдП C ++ рдореЗрдВ рдРрд╕реЗ рдХреЛрдб рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛:
#include "Linderdaum.h" sEnvironment* Env = NULL; clPtr<clRenderState> Background = NULL; void DrawOverlay(LEvent Event, const LEventArgs& Args) { Env->Renderer->GetCanvas()->FullscreenRect( Background ); } APPLICATION_ENTRY_POINT { Env = new sEnvironment(); Env->DeployDefaultEnvironment( NULL, "..\\..\\CommonMedia" ); Env->Connect( L_EVENT_DRAWOVERLAY, Utils::Bind( &DrawOverlay ) ); Background = Env->Resources->LoadShader( "Background.shader" ); Env->RunApplication( DEFAULT_CONSOLE_AUTOEXEC ); APPLICATION_EXIT_POINT( Env ); } APPLICATION_SHUTDOWN { Background = NULL; }
рдЬреНрдпрд╛рджрд╛ рддреЛ рдирд╣реАрдВ, рд╣реИ рдирд╛? рд╣рдордиреЗ рдЗрд╕реЗ
Test_LiveWallpaper.cpp рдореЗрдВ
рдбрд╛рд▓рд╛ рдФрд░ C ++ рдХреЗ рд╕рд╛рде рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╢рд╛рджрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
Background.shader рд▓рд┐рдЦреЗрдВ:
Object("clRenderState") { ShaderProgram "Plane.sp" }
рдФрд░
рдкреНрд▓реЗрди ред
#include Layout.sp in vec4 in_Vertex; in vec4 in_TexCoord; out vec2 Coord; void main() { gl_Position = in_ModelViewProjectionMatrix * in_Vertex; Coord = in_TexCoord.xy; } in vec2 Coord; uniform float ENGINE_TIME; out vec4 out_FragColor;
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд┐рд░реНрдл рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рддрд╕реНрд╡реАрд░ рдЗрд╕ рддрд░рд╣ рд╣реИ:
рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдЪ рдХреЛ рдФрд░ рднреА рдХрдо рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
Test_LiveWallpaperService.java :
package com.linderdaum.engine.Test_LiveWallpaper; import com.linderdaum.engine.LinderdaumEngineService; public class Test_LiveWallpaperService extends LinderdaumEngineService { @Override public LinderdaumEngineService.GLEngine onCreateEngine() { return new LinderdaumEngineService.GLEngine(); } }
рдЖрдкрдХреЛ
AndroidManifest.xml рдореЗрдирд┐рдлрд╝реЗрд╕реНрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.linderdaum.engine.Test_LiveWallpaper" android:versionCode="1" android:versionName="1.0.0"> <supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" /> <uses-sdk android:minSdkVersion="7" /> <uses-feature android:glEsVersion="0x00020000"/> <uses-feature android:name="android.software.live_wallpaper"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:label="Test_LiveWallpaper" android:icon="@drawable/icon" android:installLocation="preferExternal" android:debuggable="false"> <service android:name="com.linderdaum.engine.Test_LiveWallpaper.Test_LiveWallpaperService" android:label="Test_LiveWallpaper" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/wallpaper" /> </service> </application> </manifest>
рд╡рд╣ рд╕рдм рд╣реИ! рд╢реЗрд╖ рдлрд╛рдЗрд▓реЗрдВ Android рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп Linderdaum рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реИрдВред
Ndk-build рдФрд░
рдПрдВрдЯреА-рдЖрдо-рдореАрдбрд┐рдпрд╛ рдбрд┐рдмрдЧ рдЪрд▓рд╛рдПрдВред рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░
Test_LiveWallpaper-debug.apk рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕реВрдЪреА рдореЗрдВ рдирдП рд▓рд╛рдЗрд╡ рд╡реЙрд▓рдкреЗрдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред
PS рдРрд╕реА рдЫрд╛рдпрд╛ рдПрдХ рдореЛрдмрд╛рдЗрд▓ GPU рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднрд╛рд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреИрдЯрд░реА рдЬрд▓реНрджреА рд╕реЗ рдЦрд╛ рд▓реА рдЬрд╛рдПрдЧреАред рдкреНрд░рдпреЛрдЧ!