ã¬ãã¹ã³çªå·2ã äžè§åœ¢ãäœæããããããã³ã¢ã³ãŒããšã¢ã€ãã¢ãå
¥æããŸããã
1. Satia KomatineniãDave MacklinãSaid Hashimiã ãããã§ãã·ã§ãã«åãã®Android 3ã ã¿ãã¬ããããã³ã¹ããŒããã©ã³çšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã è±èªãã -MãïŒLLC "I.D. Williamsã" 2012-1,024 pã
2.
http://www.learnopengles.com/android-lesson-one-getting-started/æåã®ã¬ãã¹ã³ïŒãã¡ã
https://habrahabr.ru/post/278895/ãŸãã¯ãã¡ã
albatrossgames.blogspot.com/2016/03/opengl-es-2-android-1-opengl.html#moreã ã芧ãã ãã ïŒ OpenGL ESã䜿çšããŠ1è²ã§ç»é¢ãå¡ãã€ã¶ãæ¹æ³ãåŠã³ãŸããã ä»åºŠã¯äžè§åœ¢ãæãããäžè§åœ¢ã䜿ã£ãŠãå·Šããå³ã«åŸªç°ãããšãããæããŸãã
ãªãäžè§åœ¢ãªã®ãïŒ å®éãOpenGLã«ã¯ãããããç·ãäžè§åœ¢ã®3ã€ã®ã°ã©ãã£ãã¯ããªããã£ããããããŸããã ãšããã®è¹äœïŒå°åœ¢ïŒãšæµ·ïŒé·æ¹åœ¢ïŒãäžè§åœ¢ã䜿çšããŠæç»ãããŸãã ãåç¥ã®ããã«ã空éå
ã®ãã€ã³ãã¯3ã€ã®åº§æšïŒxãyãzïŒã«ãã£ãŠæ±ºå®ãããŸãã å³é¢ã¯å¹³ãã§ãããããå³é¢ã®ãã¹ãŠã®ãã€ã³ãã§ã0z軞ã«æ²¿ã£ã1ã€ã®åº§æšïŒç»é¢ã®å¹³é¢ã«åçŽã§ãããç§ãã¡ã«åãã£ãŠããŸãïŒã¯ãŒãã«ãªããŸãã ããšãã°ã倧ããªåžïŒã¡ã€ã³ã»ãŒã«ïŒã®2ã€ã®æ¥µç¹ã®0xããã³0y軞ã«æ²¿ã£ã座æšã瀺ããŸããã
ã³ãŒãã§ã¯ãæŽçªã®3ã€ã®ãã€ã³ãã®å®çŸ©ã¯æ¬¡ã®ããã«ãªããŸãã
ã芧ã®ãšãããæµ®åå°æ°ç¹ããŒã¿é
åãäœæãããŸãã åãã€ã³ãã«ã€ããŠããã®åº§æšãšé
è²ã瀺ãããŸãã æåã®ãã€ã³ãã¯çœãªã®ã§ãèµ€ãç·ãéã®éã¿ä¿æ°ã¯åãã§1ã«çãããªããŸãããä»ã®2ã€ã®ããŒã¯ã¯çŸããã®ããã«éã«ãªããŸãã ãããã¯åæèšåãã«ãã€ãã¹ããŸã
OpenGLã®åº§æšã®æ¬¡å
ã¯ä»»æã§ãããå®éã«ã¯ããã€ã¹ã®ç»é¢äžã®å¹
ãšé«ãã®ãã¯ã»ã«æ°ã«ãã£ãŠæ±ºå®ãããŸãã
ããã§ãOpenGLã®ãã€ã³ãããŒã¿ã転éãããããã¡ãŒãäœæããå¿
èŠããããŸãã ããã¯ãOpenGLãCã«äŒŒãèšèªã§æžãããŠããããã§ãã ãããã£ãŠãOpenGLãç解ã§ããå¥ã®åœ¢åŒã«ããŒã¿ãå€æããã¡ã¢ãªãå²ãåœãŠãŸãã
private final int mBytesPerFloat = 4;
åéšåãèŠãŠã¿ãŸãããã ãŸããByteBuffer.allocateDirectïŒïŒã䜿çšããŠãã·ã³ã¡ã¢ãªã®ãããã¯ãå²ãåœãŠãŸããã ãã®ã¡ã¢ãªã¯ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠç®¡çãããŸããïŒããã¯éèŠã§ãïŒã ã¡ã¢ãªãããã¯ã®ãµã€ãºããã€ãåäœã§ã¡ãœããã«äŒããå¿
èŠããããŸãã é ç¹ã¯floatå€æ°ãšããŠé
åã«æ ŒçŽãããfloatããšã«4ãã€ããå æãããããtriangle1VerticesData.length * mBytesPerFloatãæž¡ããŸãã ïŒãã©ã€ããŒãæçµint mBytesPerFloat = 4;ãæãåºããŠãã ãããïŒ
次ã®è¡ã¯ããã€ããããã¡ã«ãã·ã³ã³ãŒãã§ãã€ããæŽçããæ¹æ³ã瀺ããŠããŸãã 32ãããæŽæ°ãªã©ãè€æ°ã®ãã€ãã«ãŸãããå€ã«ãªããšãããšãã°æäžäœã®å€ããæäžäœã®å€ãŸã§ããã€ããç°ãªãé åºã§æžã蟌ãããšãã§ããŸãã ããã¯ãå·Šããå³ãžããŸãã¯å³ããå·Šãžãšå€§éã®ã¹ãã«ãå
¥åãããããªãã®ã§ãã æ°ã«ããŸããããéèŠãªããšã¯ãã·ã¹ãã ãšåãé åºã䜿çšããããšã§ãã 泚æïŒByteOrder.nativeOrderïŒïŒïŒãåŒã³åºããŠãããæŽçããŸãã æåŸã«ãåã
ã®ãã€ããçŽæ¥åŠçããªãããšãæåã§ãã ãããŒããåŠçãããã®ã§ãFloatBufferïŒïŒãåŒã³åºããŠã¡ã€ã³ãã€ããå«ãFloatBufferãååŸããŸãã 次ã«ããŒãäœçœ®ããéå§ããŠãmTriangle1Vertices.putïŒtriangle1VerticesDataïŒ.positionïŒ0ïŒ;ãåŒã³åºããŠãDalvikã¡ã¢ãªãããã·ã³ã¡ã¢ãªã«ããŒã¿ãã³ããŒããŸãã
ããã»ã¹ãåæ¢ãããšã¡ã¢ãªã解æŸããããããå¿é
ããå¿
èŠã¯ãããŸããã
è¡åãç解ãããããªãã¯ã¹ãç解ããããã®è¯ãã¬ãã¹ã³ã¯
www.songho.ca/opengl/gl_transform.htmlã§ããããªãã¯ã¹ãç解ããã«ã¯ããŸãOpenGLã§ãªããžã§ã¯ãããèŠããæ¹æ³ãç解ããå¿
èŠããããŸãã
ã«ã¡ã©ãæã£ãŠãåžè¹ã®åçãæ®ããããšæ³åããŠãã ããã
ã«ã¡ã©ãT.K.ã«çœ®ããŸââãããã®ç¹ãèŠç¹ãšåŒã³ãŸãã ã³ãŒãã§èŠç¹ãæå®ããªãå Žåãã«ã¡ã©ã¯ããã©ã«ãã§åº§æšïŒ0,0,0ïŒã®T.O.ã«ãªããŸãã
ã³ãŒãã§ã«ã¡ã©ã®äœçœ®ãã©ã®ããã«èšå®ãããŠããããèŠãŠã¿ãŸãããã
@Override public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
æåã¯ãæåã®ã¬ãã¹ã³ã§è¡ã£ãã®ãšåæ§ã«ãèæ¯è²ãéç°è²ã«èšå®ããŸãã
GLES20.glClearColor(0.5f, 0.5f, 0.7f, 1.0f);
次ã«ãã«ã¡ã©ãé
眮ããå®éã«T.Kã®åº§æšã瀺ããŸããã ã芧ã®ãšãããã«ã¡ã©ã¯0z軞ã«æ²¿ã£ãŠ1.5åäœã·ããããŸãïŒè·é¢OKïŒã
final float eyeX = 0.0f; final float eyeY = 0.0f; final float eyeZ = 1.5f;
次ã®ã³ãŒãè¡ã§ã¯ãã«ã¡ã©ãèŠãŠãããã€ã³ãã®åº§æšã瀺ããŠããŸãã
final float lookX = 0.0f; final float lookY = 0.0f; final float lookZ = -5.0f;
次ã®ã³ãŒãè¡ã¯ãã«ã¡ã©ã®åããŸãã¯ãã¯ãã«ã®äœçœ®ã¢ããã決å®ããŸãã 翻蚳ã倱æãããããããŸããŸãªèšäºã§ãã®åé¡ãäžæ£ç¢ºã«ãªããŸããã ä»ã®ã³ãŒãã§ã¯
final float upX = 0.0f; final float upY = 1.0f; final float upZ = 0.0f;
ããã¯ãã«ã¡ã©ãéåžžé
眮ãããããšãæå³ããŸãããããã£ãŠãæ°Žå¹³ãªããŒãã«ã«çœ®ããŠãt.0ã§ãšãããèŠãå Žåã
T.O.ããã®ããã«ãã«ã¡ã©ãã3ã€ã®ãã¯ãã«ãåºãŠãããšããŸãã éã¿ä¿æ°ã®æçµãããŒãupY = 1.0fãèšå®ããããOpenGLã«ã0U軞ãäžåãã«ãªããèšäºã®åé ã®ããã«ç»åã衚瀺ãããããšãäŒããŸãã
ãããããããã®èŠçŽ ãå
¥ãããš
final float upX = 1.0f; final float upY = 1.0f; final float upZ = 0.0f;
ãšãã¥ã¬ãŒã¿ã§æ¬¡ã®ããã«è¡šç€ºãããŸãã åžè¹ã¯äžãåã«ç»ããŸãã
0z軞ãèŠããšãã«ã¡ã©ã¯åæèšåãã«45床å転ããŸããã ãã®ãããªçµã¿åãããäœæãããš
final float upX = 1.0f; final float upY = 0.0f; final float upZ = 0.0f;
ã«ã¡ã©ã®0x軞ãèŠäžããããããŒããåçŽã«äžã«åãã£ãŠèªè¡ããŸãã
ãã¹ãŠã®ããŒã¿ãsetLookAtMã¡ãœããã«æž¡ããŸãã
Matrix.setLookAtMïŒmViewMatrixã0ãeyeXãeyeYãeyeZãlookXãlookYãlookZãupXãupYãupZïŒ;
å¯èŠã«ã¡ã©ã®ããªã¥ãŒã 次ã®ã³ãŒããæ€èšããŠãã ããã
@Override public void onSurfaceChanged(GL10 glUnused, int width, int height) {
onSurfaceChangedã¡ãœããã䜿çšãããšãããã€ã¹èªäœã®åãã®å€æŽãç·Žç¿ã§ããŸãã
ãšãã¥ã¬ãŒã¿ã§ã¬ãžã§ããããªã³ã«ããŠããã®ãããªç»åãèŠãŠã¿ãŸããã
ããŸãçŸãããããŸããããåºæ¬çã«ã¯ç§ãã¡ãæãããã®ã§ãã
次ã®ã³ãŒãè¡ã¯ç»é¢ãµã€ãºãèšå®ããŸãã ãŸããç»é¢ã®å·Šäžé
ã®åº§æšïŒ0,0ïŒãèšå®ããŠãããç»é¢ã®å¹
ãšé«ããèšå®ããŸãã
GLES20.glViewportïŒ0ã0ãå¹
ãé«ãïŒ;
ããäžåºŠå³é¢ãèŠãŠã¿ãŸãããã
ã«ã¡ã©ãèŠãäœç©ã¯ãè§éå°ã®äœç©ïŒA
1 ãB
1 ãC
1 ãD
1 ãA
2 ãB
2 ãC
2 ãD
2 ïŒã«å²ãŸããŠããŸãã
æåã«ãããã€ã¹ã®å¹
ãšé«ãã®æ¯çïŒæ¯çïŒãèŠã€ããŸãã
æçµãããŒãæ¯=ïŒãããŒãïŒå¹
/ââé«ã;
次ã«ãå¯èŠã®å¹³è¡å
é¢äœïŒA
1 ãB
1 ãC
1 ãD
1 ïŒã®å·ŠåŽãšå³åŽã®0xã«æ²¿ã£ãŠåº§æšãèšå®ããŸãã
æçµãããŒãå·Š= -ratio;
æçµãããŒãå³=æ¯ç;
ããã¯ã¹ã®äžåŽãšäžåŽã®0yã«æ²¿ã£ãŠåº§æšãèšå®ããŸãïŒA
1 ãB
1 ãC
1 ãD
1 ïŒã
æçµãããŒãåº= -1.0f;
æçµãããŒãããã= 1.0f;
ã«ã¡ã©ããåé¢ãŸã§ã®è·é¢ïŒKO
1 ïŒ
æçµãããŒã= 1.0fä»è¿;
ã«ã¡ã©ããèé¢ãŸã§ã®è·é¢ïŒKO
2 ïŒ
æçµãããŒãfar = 10.0f;
ãããªãã¯ã¹å€æãé©çšãã
Matrix.frustumMïŒmProjectionMatrixã0ãå·Šãå³ãäžãäžãè¿ããé ãïŒ;
䜿çšãããããªãã¯ã¹ã«ã¯ããã€ãã®ç°ãªãã¿ã€ãããããŸãã
1.ã¢ãã«ã®ãããªãã¯ã¹ã ãã®ãããªãã¯ã¹ã¯ãã¢ãã«ããäžçãã®ã©ããã«é
眮ããããã«äœ¿çšãããŸãã ããšãã°ãè»ã®ã¢ãã«ãããããããæ±1000 mã®è·é¢ã«é
眮ããå Žåãã¢ãã«ãããªãã¯ã¹ã䜿çšããŸãã
2.ãã¥ãŒãããªãã¯ã¹ã ãã®ãããªãã¯ã¹ã¯ã«ã¡ã©ã§ãã æ±ã«1000 mã«äœçœ®ããè»ãèŠããå Žåã¯ã1000 mæ±ã«ç§»åããå¿
èŠããããŸãã ãŸãã¯ãåããã«æ®ãã®äžçã1000 m西ã«ç§»åã§ããŸãã ãããè¡ãã«ã¯ããã¥ãŒãããªãã¯ã¹ã䜿çšããŸãã
3.å°åœ±è¡åã ç»é¢ã¯ãã©ãããªã®ã§ãæçµçã«ç»é¢äžã®ãã¥ãŒã®ããããžã§ã¯ããã«å€æãã3DããŒã¹ãã¯ãã£ããååŸããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãå°åœ±è¡åã䜿çšããŸãã
é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã®å®çŸ©OpenGL ES 2.0ã®æãåçŽãªå³é¢ã§ããã·ã§ãŒããŒãšåŒã°ãããœãããŠã§ã¢ã»ã°ã¡ã³ãã®äœæãå¿
èŠã§ãã ã·ã§ãŒããŒã¯OpenGL ES 2.0ã®ã³ã¢ã圢æããŸãã é ç¹ã¯é ç¹ã·ã§ãŒããŒã«ãã£ãŠåŠçãããé ç¹ãã€ã³ãã®ã¿ãåŠçããŸãã é ç¹éã®ã¹ããŒã¹ã¯ãã©ã°ã¡ã³ãã·ã§ãŒããŒã䜿çšããŠåŠçãããç»é¢äžã®ãã¹ãŠã®ãã¯ã»ã«ãåŠçããŸãã
ã·ã§ãŒããŒãèšè¿°ããããã«ãOpenGL Shading LanguageïŒGLSLïŒã䜿çšãããŸãã
åã·ã§ãŒããŒã¯ãäž»ã«å
¥åãåºåãããã³ããã°ã©ã ã§æ§æãããŠããŸãã ãŸãããã©ãŒã ãå®çŸ©ããŸããããã¯ããã¹ãŠã®å€æãå«ãçµåè¡åã§ãã ããã¯ãã¹ãŠã®é ç¹ã«å¯ŸããŠäžå®ã§ãããããããã¹ã¯ãªãŒã³ã«æ圱ããããã«äœ¿çšãããŸãã 次ã«ãäœçœ®ãšè²ã®2ã€ã®å±æ§ãå®çŸ©ããŸãã ãããã®å±æ§ã¯ãåã«å®çŸ©ãããããã¡ãŒããèªã¿åãããåé ç¹ã®äœçœ®ãšè²ãæå®ããŸãã 次ã«ãäžè§åœ¢å
šäœã®å€ãè£éããŠãã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãããªãšãŒã·ã§ã³ïŒè²ã®å€æŽïŒãå®çŸ©ããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã«é¢ããŠã¯ãåãã¯ã»ã«ã®è£éå€ãå«ãŸããŸãã
é ç¹ãèµ€ãç·ãéã«ãªããç»é¢äžã®ãµã€ãºã10ãã¯ã»ã«ãå ããäžè§åœ¢ãç¹å®ãããšããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒãå®è¡ãããšããã¯ã»ã«ããšã«ç°ãªãå€åããè²ãå«ãŸããŸãã ããæç¹ã§ãå€æŽã¯èµ€ã«ãªããŸãããèµ€ãšéã®äžéã§ã¯ãããŒã³ã¿è²ã«ãªãå ŽåããããŸãã
é ç¹ã·ã§ãŒããŒãæ€èšããŠãã ãã
final String vertexShader = "uniform mat4 u_MVPMatrix; \n"
ãŠããã©ãŒã ãä»ããŠãèšç®ã«äœ¿çšã§ããå€éšããŒã¿ãã·ã§ãŒããŒã«è»¢éãããŸãã ãŠããã©ãŒã ã¯èªã¿åãå°çšã§äœ¿çšã§ããŸãã ãŠããã©ãŒã ã¯ãé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã®äž¡æ¹ã«æž¡ãããšãã§ããŸãã ãã®å ŽåããŠããã©ãŒã ã¯1ã€ã ãã§ããããã¯ãmodel-view-projection u_MVPMatrixã®ãããªãã¯ã¹ã§ãããé ç¹ã·ã§ãŒããŒã«æž¡ãããŸãã mat4ããŒã¯ãŒãã¯ãæµ®åå°æ°ç¹æ°ã§æ§æããã4x4ãããªãã¯ã¹ã§ããããšãæå³ããŸãã ãŠããã©ãŒã ã¯ç¹å®ã®é ç¹ã«æ±ºããŠé¢é£ä»ããããŠããããã°ããŒãã«å®æ°ã§ãã ãŠããã©ãŒã ã®ååã«ã¯ãéåžžãæ¥é èŸu_ã䜿çšãããŸãã
å±æ§ã¯ãé ç¹ã®å±æ§ã§ãã é ç¹ã«ã¯ããŸããŸãªå±æ§ãèšå®ã§ããŸãã ããšãã°ã空éå
ã®äœçœ®ã®åº§æšãæ³ç·ãã¯ãã«ã®åº§æšãè²ã ããã«ãä»»æã®å±æ§ãé ç¹ã·ã§ãŒããŒã«æž¡ãããšãã§ããŸãã å±æ§ã¯é ç¹ã®ããããã£ã§ãããããåé ç¹ã«æå®ããå¿
èŠãããããšãç解ããããšãéèŠã§ãã å±æ§ã¯é ç¹ã·ã§ãŒããŒã«ã®ã¿æž¡ãããŸãã å±æ§ã¯ãé ç¹ã·ã§ãŒããŒã«å¯ŸããŠèªã¿åãå°çšã§ãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§ã¯å±æ§ãå®çŸ©ã§ããŸããã 䟿å®äžããã¬ãã£ãã¯ã¹a_ã§å±æ§ã瀺ããŸãã
é ç¹ã·ã§ãŒããŒã§3ã€ã®å±æ§ãå®çŸ©ããŸãã
å±æ§vec4 a_Position;
å€æ°a_Positionã¯ãé ç¹ã®äœçœ®ïŒåº§æšïŒãåŠçããé ç¹å±æ§ã§ããããã¯4ã³ã³ããŒãã³ããã¯ãã«ïŒvec4ïŒã§ãã
é ç¹ã«ã©ãŒå±æ§
å±æ§vec4 a_Color;
è²è£éå±æ§
å€åããvec4 v_Color;
ã¡ã€ã³é¢æ°ã³ãŒãããã詳现ã«æ€èšããŠãã ããã
v_Color = a_Color;
é ç¹ã®è²ã«é¢ããæ
å ±ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ããŸãã
gl_Position = u_MVPMatrix * a_Position;
ãããªãã¯ã¹ã䜿çšããŠé ç¹ã®äœçœ®ãå€æããæ°ããå€æ°gl_Positionã«æžã蟌ã¿ãŸãã
gl_Positionã·ã¹ãã å€æ°ã¯ãã¹ã¯ãªãŒã³ãã¬ãŒã³ã«æ圱ãããé ç¹ã®åº§æšãå®çŸ©ãã4ã³ã³ããŒãã³ããã¯ãã«ã§ãã gl_Positionå€æ°ã¯é ç¹ã·ã§ãŒããŒã§å®çŸ©ããå¿
èŠããããŸããããããªããšãç»é¢ã«äœã衚瀺ãããŸããã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒããå§ããŸãããã final String fragmentShader = "precision mediump float; \n"
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®å Žåãé«ã粟床ã¯å¿
èŠãªããããããã©ã«ãã®ç²ŸåºŠã¯å¹³åã«èšå®ãããŠããŸãã é ç¹ã·ã§ãŒããŒã§ã¯ãããã©ã«ãã§ç²ŸåºŠãé«ããªã£ãŠããŸãã
粟å¯ããã£ã¢ã ãããŒã;
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®æçµçãªç®æšã¯ããã¯ã»ã«ã®è²ãååŸããããšã§ãã èšç®ããããã¯ã»ã«ã«ã©ãŒã¯gl_FragColorã·ã¹ãã å€æ°ã«æžã蟌ãŸããå¿
èŠããããŸãã æãåçŽãªäŸã§ã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ãã¯ã»ã«ã«ã©ãŒãèšç®ãããé ç¹ã®è²ããè£éã«ãã£ãŠååŸããã«ã©ãŒv_colorã®å€ãåã«å²ãåœãŠãŸãã
gl_FragColor = v_color;
OpenGLã§ã®ã·ã§ãŒããŒã®ããŒã
ããã°ã©ã ã§é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒããªã³ã¯ãã
é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã䜿çšããåã«ãããã°ã©ã ã§ãããããªã³ã¯ããå¿
èŠããããŸãã ããããé ç¹ã·ã§ãŒããŒåºåããã©ã°ã¡ã³ãã·ã§ãŒããŒå
¥åã«æ¥ç¶ãããã®ã§ãã ããã«ãããããã°ã©ã ããã®å
¥åãæž¡ããã·ã§ãŒããŒã䜿çšããŠå³åœ¢ãæç»ã§ããŸãã
æ°ããããã°ã©ã ãªããžã§ã¯ããäœæããæåããå Žåã¯ãã·ã§ãŒããŒãã¢ã¿ããããŸãã äœçœ®ãšè²ã®ããŒã¿ãå±æ§ãšããŠæž¡ãããã®ã§ããããã®å±æ§ãé¢é£ä»ããå¿
èŠããããŸãã 次ã«ãã·ã§ãŒããŒãæ¥ç¶ããŸãã
ããã°ã©ã ãæ£åžžã«ãªã³ã¯ããããããã€ãã®å€§ããªã¿ã¹ã¯ãå®äºããå®éã«äœ¿çšã§ããããã«ãªããŸãã æåã®ã¿ã¹ã¯ã¯ãªã³ã¯ãååŸããããšã§ãããã°ã©ã ã«ããŒã¿ã転éã§ããŸãã 次ã«ãæç»ã®é²è¡äžã«ãã®ããã°ã©ã ã䜿çšããããOpenGLã«æ瀺ããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯1ã€ã®ããã°ã©ã ã®ã¿ã䜿çšãããããonDrawFrameïŒïŒã®ä»£ããã«onSurfaceCreatedïŒïŒã«é
眮ã§ããŸãã
éèŠæ圱ã®ã€ã³ã¹ããŒã«
onSurfaceChangedïŒïŒã¡ãœããã¯ãå°ãªããšã1åãããã³ãµãŒãã§ã¹ãå€æŽããããã³ã«åŒã³åºãããŸãã ã¹ã¯ãªãŒã³äžã§æ圱ãå€æŽããããã³ã«æ圱ãããªãã¯ã¹ããªã»ããããå¿
èŠããããããonSurfaceChangedïŒïŒã¯ãããè¡ãã®ã«æé©ãªå Žæã§ãã
ç»é¢ã«ãªããžã§ã¯ãã衚瀺ããåºåã¯onDrawFrameã¡ãœããã§çæãããŸãïŒGL10 glUnusedïŒ
äžè§åœ¢ã0x軞ã«æ²¿ã£ãŠç§»åããããã«ãå€äœè¡åãé©çšããåè¡šé¢ã®æŽæ°ã«å¯ŸããŠxå€äœã®0.001å¢å ãæå®ããŸãã xã1ãŸãã¯ç»é¢ã®å³ç«¯ã«éãããããã«ãŒãã«ããŸãã
Matrix.translateMïŒmModelMatrixã0ãx + 0.3fã0.0fã0.0fïŒ;
drawTriangleïŒmTriangle2VerticesïŒ;
ifïŒx <= 1ïŒ{x =ïŒfloatïŒïŒx + 0.001ïŒ;}
ãã®ä»{x = 0;}
2åç®ã®ã¬ãã¹ã³ã§ã¯ååããããšæããŸãã å€ãã®è³ªåãèŠèœãšãããŠããããããã®ç解ã¯åŸã§æ¥ãã§ãããã
Android Studioã§ã¬ãã¹ã³ãå®è¡ããŸããåã®ã¬ãã¹ã³ã®ãããžã§ã¯ãã䜿çšãããã®ã³ãŒããåçŽã«ã³ããŒããããšããå§ãããŸãã
æã£ãŠããªãå Žåã¯ãæåã®Open GLãããžã§ã¯ããäœæããŸã
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.adc2017gmail.firstopenglproject"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <activity android:name=".FirstOpenGLProjectActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
FirstOpenGLProjectActivity.java package com.adc2017gmail.firstopenglproject; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.content.pm.ConfigurationInfo; import android.opengl.GLSurfaceView; import android.os.Bundle; public class FirstOpenGLProjectActivity extends Activity { private GLSurfaceView mGLSurfaceView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGLSurfaceView = new GLSurfaceView(this);
LessonOneRenderer.java package com.adc2017gmail.firstopenglproject; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class LessonOneRenderer implements GLSurfaceView.Renderer { private float[] mModelMatrix = new float[16]; private float[] mViewMatrix = new float[16]; private float[] mProjectionMatrix = new float[16]; private float[] mMVPMatrix = new float[16]; private final FloatBuffer mTriangle1Vertices; private final FloatBuffer mTriangle2Vertices; private final FloatBuffer mTriangle3Vertices; private final FloatBuffer mTriangle4Vertices; private final FloatBuffer mTriangle5Vertices; private final FloatBuffer mTriangle6Vertices; private int mMVPMatrixHandle; private int mPositionHandle; private int mColorHandle; private final int mBytesPerFloat = 4; private final int mStrideBytes = 7 * mBytesPerFloat; private final int mPositionOffset = 0; private final int mPositionDataSize = 3; private final int mColorOffset = 3; private final int mColorDataSize = 4; private float x; public LessonOneRenderer() {
1. , , . Android 3 . .: . . â .: «..». 2012 â 1024 .
2.
http://www.learnopengles.com/android-lesson-one-getting-started/3.
http://andmonahov.blogspot.com/2012/10/opengl-es-20-1.html4.
https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php5.
https://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf