package Ġcom . h aha . record . camera Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Surface Texture Ċ import Ġandroid . opengl . GLES 1 1 Ext Ċ import Ġandroid . opengl . GLES 2 0 .* Ċ import Ġandroid . opengl . Matrix Ċ import Ġandroid . util . Log Ċ import Ġcom . h aha . record . e gl . Custom Gl Surface View Ċ import Ġcom . h aha . record . R Ċ import Ġcom . h aha . record . opengl . F bo Render Ċ import Ġcom . h aha . record . opengl . Shader Util Ċ import Ġcom . h aha . record . util . Display Util Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . Float Buffer Ċ Ċ /** Ċ Ġ* Ġä»İ æĳ Ħ åĥı å¤´ æ¸²æŁĵ åĪ° f bo ãĢĤ ä½¿çĶ¨ æī©å±ķ çº ¹ çĲĨ ãĢĤ Ċ Ġ*/ Ċ class ĠCamera Render ( private Ġval ĠmContext : ĠContext ) Ġ: ĠCustom Gl Surface View . Custom Render , ĊĠĠĠĠĠĠĠ ĠSurface Texture . On Frame Available Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Camera Render " ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġ é¡¶ çĤ¹ çĿĢ èī² åĻ¨ åıĺ æį¢ çŁ©éĺµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġu Matrix Location : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġ é¡¶ çĤ¹ åĿĲæłĩ æķ°ç»Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġvertex Data Ġ= Ġfloat ArrayOf (- 1 f , Ġ- 1 f , Ġ 1 f , Ġ- 1 f , Ġ- 1 f , Ġ 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠ Ġprivate Ġvar Ġvertex Buffer : ĠFloat Buffer ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çº ¹ çĲĨ åĿĲæłĩ æķ°ç»Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġfragment Data Ġ= Ġfloat ArrayOf ( 0 f , Ġ 1 f , Ġ 1 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f ) ĊĠĠĠ Ġprivate Ġvar Ġfragment Buffer : ĠFloat Buffer ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ĳ Ħ åĥı å¤´ æ¸²æŁĵ çļĦ çº ¹ çĲĨ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġcamera Texture Id Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ ĳ Ħ åĥı å¤´ æ¸²æŁĵ çļĦ Surface Texture ï¼Ī Surface Texture åıĪ åĴĮ camera Texture Id ç»ĳå®ļ ï¼Į ä½¿ å¾Ĺ æĳ Ħ åĥı å¤´ æķ°æį® åı¯ä»¥ æ¸²æŁĵ åĪ° camera Texture Id çļĦ çº ¹ çĲĨ ä¸Ĭ ï¼ī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġsurface Texture : ĠSurface Texture ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĿĢ èī² åĻ¨ ç¨ĭåºı id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprogram : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĿĢ èī² åĻ¨ é¡¶ çĤ¹ åĿĲæłĩ åŃĹæ®µ location ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġv Position : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĿĢ èī² åĻ¨ çº ¹ çĲĨ åĿĲæłĩ åĿĲæłĩ åŃĹæ®µ location ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġf Position : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġv bo Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġf bo Id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF BO çļĦ çº ¹ çĲĨ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġf bo Texture id : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä½¿çĶ¨ ä¸Ģ ç»´ æķ°ç»Ħ è¡¨ç¤º 4 * 4 çļĦ äºĮ ç»´ æķ°ç»Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmatrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å±ı å¹ķ å®½ é«ĺ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġscreen Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġscreen Height : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġwidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġheight : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä»İ f bo æ¸²æŁĵ åĪ° æĳ Ħ åĥı å¤´ çļĦ æ¸²æŁĵ åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġf bo Render : ĠF bo Render ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġon Surface Created Listener : ĠOn Surface Created Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen Width Ġ= ĠDisplay Util . get Screen Width ( mContext ) ĊĠĠĠĠĠĠĠ Ġscreen Height Ġ= ĠDisplay Util . get Screen Height ( mContext ) ĊĊĠĠĠĠĠĠĠ Ġf bo Render Ġ= ĠF bo Render ( mContext ) ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ æķ°ç»Ħ æķ°æį® åŃĺ æĶ¾åľ¨ Native å±Ĥ ĊĠĠĠĠĠĠĠ Ġvertex Buffer Ġ= ĠByteBuffer . allocate Direct ( vertex Data . size Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( vertex Data ) ĊĠĠĠĠĠĠĠ Ġvertex Buffer !!. position ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġfragment Buffer Ġ= ĠByteBuffer . allocate Direct ( fragment Data . size Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( fragment Data ) ĊĠĠĠĠĠĠĠ Ġfragment Buffer !!. position ( 0 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Created () Ġ{ ĊĠĠĠĠĠĠĠ Ġf bo Render ?. onCreate () ĊĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Surface Created ") ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ é¡¶ çĤ¹ åĴĮ çīĩ æ®µ çĿĢ èī² åĻ¨ ç¨ĭåºı ä»£çłģ ĊĠĠĠĠĠĠĠ Ġval Ġvertex Source Ġ= ĠShader Util . read Raw T Ext ( mContext , ĠR . raw . vertex _ shader ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Source Ġ= ĠShader Util . read Raw T Ext ( mContext , ĠR . raw . fragment _ shader ) ĊĠĠĠĠĠĠĠ Ġ// åĪĽå»º çĿĢ èī² åĻ¨ ç¨ĭåºı ĊĠĠĠĠĠĠĠ Ġprogram Ġ= ĠShader Util . create Program ( vertex Source , Ġfragment Source ) ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ çĿĢ èī² åĻ¨ ä¸Ń é¡¶ çĤ¹ åĿĲæłĩ åĴĮ çº ¹ çĲĨ åĿĲæłĩ åŃĹæ®µ çļĦ location ĊĠĠĠĠĠĠĠ Ġv Position Ġ= ĠglGet Attrib Location ( program , Ġ" av _ Position ") ĊĠĠĠĠĠĠĠ Ġf Position Ġ= ĠglGet Attrib Location ( program , Ġ" af _ Position ") ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ çĿĢ èī² åĻ¨ ä¸Ń é¡¶ çĤ¹ åĿĲæłĩ åıĺ æį¢ çŁ©éĺµ åŃĹæ®µ çļĦ location ĊĠĠĠĠĠĠĠ Ġu Matrix Location Ġ= ĠglGet UniformLocation ( program , Ġ" u _ Matrix ") ĊĊĠĠĠĠĠĠĠ Ġ// ---------------- ------------ åĪĿå§ĭåĮĸ v bo -------------------------------- -- ĊĠĠĠĠĠĠĠ Ġval Ġvb os Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġgl Gen Buffers ( 1 , Ġvb os , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġv bo Id Ġ= Ġvb os [ 0 ] ĊĠĠĠĠĠĠĠ Ġ// è¯¥ ç¼ĵ åĨ² æĮĩå®ļ ä¸º v bo ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġv bo Id ) ĊĠĠĠĠĠĠĠ Ġ// ä¸º v bo ç¼ĵ åĨ² å¼Ģ è¾ Ł æĮĩå®ļ å¤§å°ı çļĦ åĨħåŃĺ ç©ºéĹ´ ĊĠĠĠĠĠĠĠ Ġgl BufferData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ ARRAY _ BUFFER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data . size Ġ* Ġ 4 Ġ+ Ġfragment Data . size Ġ* Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ STATIC _ DRAW ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// v bo ç¼ĵ åĨ² åĪĿå§ĭåĮĸ æķ°æį® ï¼Ī é¡¶ çĤ¹ åĿĲæłĩ + çº ¹ çĲĨ åĿĲæłĩ ï¼ī ĊĠĠĠĠĠĠĠ Ġgl Buffer Sub Data ( GL _ ARRAY _ BUFFER , Ġ 0 , Ġvertex Data . size Ġ* Ġ 4 , Ġvertex Buffer ) ĊĠĠĠĠĠĠĠ Ġgl Buffer Sub Data ( GL _ ARRAY _ BUFFER , Ġvertex Data . size Ġ* Ġ 4 , Ġfragment Data . size Ġ* Ġ 4 , Ġfragment Buffer ) ĊĠĠĠĠĠĠĠ Ġ// è§£ ç»ĳ v bo ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// -------------------------------- - è§£ ç»ĳ v bo -------------------------------- -- ĊĊĠĠĠĠĠĠĠ Ġ// -------------------------------- - è®¾ç½® f bo å¸ § ç¼ĵ åĨ² -------------------------------- ------- ĊĠĠĠĠĠĠĠ Ġval Ġfb os Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġ// todo Ġ åºĶè¯¥ åľ¨ ä¸įéľĢè¦ģ f bo æĹ¶åĢĻ åĪłéĻ¤ f bo ĊĠĠĠĠĠĠĠ Ġgl Gen Buffers ( 1 , Ġfb os , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġf bo Id Ġ= Ġfb os [ 0 ] ĊĠĠĠĠĠĠĠ Ġ// ç»ĳå®ļ äºĨ f bo , åĪĻ åĲİ éĿ¢ åľ¨ è§£ ç»ĳ f bo åīį çļĦ æĵįä½ľ éĥ½æĺ¯ åŁºäºİ f bo ĊĠĠĠĠĠĠĠ Ġ// ä¹Łåı¯ä»¥ æĬĬ å¸ § ç¼ĵ åĨ² åĪĨ å¼Ģ ç»ĳå®ļ åĪ° è¯» æĪĸ åĨĻ çĽ®æłĩ ä¸Ĭ ï¼Į åĪĨåĪ« ä½¿çĶ¨ GL _ READ _ FRAMEBUFFER æĪĸ GL _ DRAW _ FRAMEBUFFER æĿ¥ åģļ è¿Ļ ä»¶ äºĭ ãĢĤ å¦Ĥæŀľ ç»ĳå®ļ åĪ°äºĨ GL _ READ _ FRAMEBUFFER ï¼Į å°± èĥ½ æī§è¡Į æīĢæľī è¯»åıĸ æĵįä½ľ ĊĠĠĠĠĠĠĠ Ġ// Ġï¼Į åĥı gl Read Pixels è¿Ļæł· çļĦ åĩ½æķ° ä½¿çĶ¨ äºĨ ï¼Ľ ç»ĳå®ļ åĪ° GL _ DRAW _ FRAMEBUFFER ä¸Ĭ ï¼Į å°± åħģè®¸ è¿Ľè¡Į æ¸²æŁĵ ãĢģ æ¸ħ ç©º åĴĮ åħ¶ä»ĸ çļĦ åĨĻåħ¥ æĵįä½ľ ãĢĤ å¤§ å¤ļ æķ° æĹ¶åĢĻ ä½ł ä¸į å¿ħ åĪĨ å¼Ģ çĶ¨ ï¼Į ĊĠĠĠĠĠĠĠ Ġ// Ġ éĢļå¸¸ æĬĬ ä¸¤ä¸ª éĥ½ ç»ĳå®ļ åĪ° GL _ FRAMEBUFFER ä¸Ĭ å°± è¡Į ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġf bo Id ) ĊĊĠĠĠĠĠĠĠ Ġ// ---- ä¸º f bo åĪĽå»º çº ¹ çĲĨ éĻĦ ä»¶ ----- ï¼Ī éĻ¤ æŃ¤ è¿ĺ f bo åı¯ä»¥ä½¿çĶ¨ æ¸²æŁĵ ç¼ĵ åĨ² å¯¹è±¡ ( Render buffer Ġobjects ) ï¼ī ĊĠĠĠĠĠĠĠ Ġval Ġtexture Ids Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġgl Gen Textures ( 1 , Ġtexture Ids , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġf bo Texture id Ġ= Ġtexture Ids [ 0 ] ĊĠĠĠĠĠĠĠ Ġ// ç»ĳå®ļ f bo çļĦ çº ¹ çĲĨ ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġf bo Texture id ) ĊĠĠĠĠĠĠĠ Ġ// çİ¯ ç» ķ æ¨¡å¼ı ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ WRAP _ S , ĠGL _ REPEAT ) ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ WRAP _ T , ĠGL _ REPEAT ) ĊĠĠĠĠĠĠĠ Ġ// è¿ĩæ»¤ æ¨¡å¼ı ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ MIN _ FILTER , ĠGL _ LINEAR ) ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GL _ TEXTURE _ 2 D , ĠGL _ TEXTURE _ MAG _ FILTER , ĠGL _ LINEAR ) ĊĠĠĠĠĠĠĠ Ġ// æĮĩå®ļ çº ¹ çĲĨ çĽ®æłĩ çļĦ åĽ¾åĥı çļĦ ç¼ĵ åĨ² å° º å¯ ¸ ãĢģ é¢ľèī² ç±»åŀĭ æł¼å¼ı ãĢģ æķ°æį® ç±»åŀĭ ï¼Ī æľĢåĲİ åıĤæķ° ä¼ł null ï¼Į åį³ åħĪ å¼Ģ è¾ Ł ç©ºéĹ´ åĴĮ å®ļä¹ī æķ°æį® ç±»åŀĭ ï¼Į åĲİ éĿ¢ æīį ä¼ł åħ·ä½ĵ æķ°æį® ãĢĤ åį³ å¯¹äºİ è¿Ļä¸ª çº ¹ çĲĨ ï¼Į æĪĳä»¬ åıª åĪĨéħį åĨħåŃĺ ï¼Į èĢĮ ä¸į åİ» å¡« åħħ å®ĥ ï¼ī ĊĠĠĠĠĠĠĠ Ġ// çº ¹ çĲĨ å¡« åħħ ä¼ļ åľ¨ æ¸²æŁĵ åĪ° å¸ § ç¼ĵ åĨ² çļĦæĹ¶åĢĻ åİ» åģļ ĊĠĠĠĠĠĠĠ Ġ// åĲĮ æł· ï¼Į è¦ģ æ³¨æĦı ï¼Į æĪĳä»¬ ä¸į çĶ¨ åħ³ å¿ĥ çİ¯ ç» ķ æĸ¹å¼ı æĪĸèĢħ Mip map ï¼Į åĽłä¸º åľ¨ å¤§ å¤ļ æķ° æĹ¶åĢĻ éĥ½ ä¸įä¼ļ éľĢè¦ģ å®ĥä»¬ çļĦ ĊĠĠĠĠĠĠĠ Ġgl TexImage 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ TEXTURE _ 2 D , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ RGBA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ RGBA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ UNSIGNED _ BYTE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ çº ¹ çĲĨ åĽ¾åĥı ç»Ļ F BO ä½ľä¸º ä¸Ģä¸ª é¢ľèī² éĻĦ ä»¶ ( F BO æıĲä¾ĽäºĨ é¢ľèī² ç¼ĵ åĨ² ãĢģ æ·± åº¦ åĴĮ æ¨¡æĿ¿ ç¼ĵ åĨ² ), ä½¿ å¾Ĺ æ¸²æŁĵ åĪ° è¯¥ çº ¹ çĲĨ çļĦæķ°æį® ä¼ļ åŃĺ æĶ¾åľ¨ å¸ § ç¼ĵ åĨ² ä¸Ń ĊĠĠĠĠĠĠĠ Ġ// ä¸Ģä¸ª éĻĦ ä»¶ å°±æĺ¯ ä¸Ģä¸ª åĨħåŃĺ åľ°åĿĢ ï¼Į è¿Ļä¸ª åĨħåŃĺ åľ°åĿĢ éĩĮéĿ¢ åĮħåĲ« ä¸Ģä¸ª ä¸º å¸ § ç¼ĵ åĨ² åĩĨå¤ĩ çļĦ ç¼ĵ åĨ² ï¼Į å®ĥ åı¯ä»¥ æĺ¯ ä¸ª åĽ¾åĥı ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġtarget ï¼ļ æĪĳä»¬ æīĢ åĪĽå»º çļĦ å¸ § ç¼ĵ åĨ² ç±»åŀĭçļĦ çĽ®æłĩ ï¼Ī ç»ĺ åĪ¶ ãĢģ è¯»åıĸ æĪĸ ä¸¤ èĢħ éĥ½ æľī ï¼īãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġattachment ï¼ļ æĪĳä»¬ æīĢ éĻĦ åĬł çļĦ éĻĦ ä»¶ çļĦ ç±»åŀĭ ãĢĤ çİ°åľ¨ æĪĳä»¬ éĻĦ åĬł çļĦæĺ¯ ä¸Ģä¸ª é¢ľèī² éĻĦ ä»¶ ãĢĤ éľĢè¦ģ æ³¨æĦı ï¼Į æľĢåĲİ çļĦ éĤ£ ä¸ª 0 æĺ¯ æļ Ĺ ç¤º æĪĳä»¬ åı¯ä»¥ éĻĦ åĬł 1 ä¸ª ä»¥ä¸Ĭ é¢ľèī² çļĦ éĻĦ ä»¶ ãĢĤ æĪĳä»¬ ä¼ļ åľ¨ åĲİ éĿ¢çļĦ æķĻ ç¨ĭ ä¸Ń è° Ī åĪ° ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġtext arget ï¼ļ ä½ł å¸ĮæľĽ éĻĦ åĬł çļĦ çº ¹ çĲĨ ç±»åŀĭ ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġtexture ï¼ļ éĻĦ åĬł çļĦ å®ŀéĻħ çº ¹ çĲĨ id ãĢĤ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġlevel ï¼ļ Mip map Ġlevel ãĢĤ æĪĳä»¬ è®¾ç½®ä¸º 0 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġgl Framebuffer Texture 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ FRAMEBUFFER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ COLOR _ ATTACHMENT 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL _ TEXTURE _ 2 D , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf bo Texture id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// æ£ĢæŁ¥ æĺ¯åĲ¦ ç»ĳå®ļ æĪĲåĬŁ ĊĠĠĠĠĠĠĠ Ġif Ġ( gl Check Framebuffer Status ( GL _ FRAMEBUFFER ) Ġ!= ĠGL _ FRAMEBUFFER _ COMPLETE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" f bo Ġwrong ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" f bo Ġsuccess ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// è§£ ç»ĳ çº ¹ çĲĨ åĴĮ F BO ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// -------------------------------- - è§£ ç»ĳ f bo ç¼ĵ åĨ² -------------------------------- ------- ĊĊĠĠĠĠĠĠĠ Ġ// -------------------------------- ------ æĳ Ħ åĥı å¤´ æī©å±ķ çº ¹ çĲĨ åĴĮ Surface Texture ç»ĳå®ļ -------------------------------- --- ĊĠĠĠĠĠĠĠ Ġval Ġtexture Se os Id Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġgl Gen Textures ( 1 , Ġtexture Se os Id , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// æĳ Ħ åĥı å¤´ çº ¹ çĲĨ ĊĠĠĠĠĠĠĠ Ġcamera Texture Id Ġ= Ġtexture Se os Id [ 0 ] ĊĠĠĠĠĠĠĠ Ġ// æĳ Ħ åĥı å¤´ çº ¹ çĲĨ éľĢè¦ģ ç»ĳ å®ļçļĦ çº ¹ çĲĨ çĽ®æłĩ ä¸º æī©å±ķ çº ¹ çĲĨ ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , Ġcamera Texture Id ) ĊĠĠĠĠĠĠĠ Ġ// ä½¿çĶ¨ æī©å±ķ çº ¹ çĲĨ æīį åı¯ä»¥åľ¨ ä¸Ģä¸ª çº ¹ çĲĨ ä¸Ĭ æ¸²æŁĵ y uv ä¸īä¸ª éĢļ éģĵ çļĦæķ°æį® ï¼Ī åĨħéĥ¨ åģļ äºĨ y uv åĴĮ rgb çļĦ è½¬æį¢ ï¼Ł ï¼ī ĊĊĠĠĠĠĠĠĠ Ġ// çİ¯ ç» ķ æĸ¹å¼ı ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGL _ TEXTURE _ WRAP _ S , ĠGL _ MIR RO RED _ REPEAT ) ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGL _ TEXTURE _ WRAP _ T , ĠGL _ MIR RO RED _ REPEAT ) ĊĊĠĠĠĠĠĠĠ Ġ// è¿ĩæ»¤ æĸ¹å¼ı ĊĠĠĠĠĠĠĠ Ġ// æĶ¾ å¤§çļĦ è¿ĩæ»¤ ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGL _ TEXTURE _ MIN _ FILTER , ĠGL _ LINEAR ) ĊĠĠĠĠĠĠĠ Ġ// ç¼© å°ı çļĦ è¿ĩæ»¤ ĊĠĠĠĠĠĠĠ Ġgl TexParameter i ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , ĠGL _ TEXTURE _ MAG _ FILTER , ĠGL _ LINEAR ) ĊĠĠĠĠĠĠĠ Ġ// Surface Texture åĴĮ OpenGL çº ¹ çĲĨ ç»ĳå®ļ ( Surface Texture æĺ¯ OpenGL åĴĮ Camera çļĦ æ¡ ¥ æ¢ ģ ) ĊĠĠĠĠĠĠĠ Ġ// ä½¿ å¾Ĺ Camera é¢Ħ è§Ī æķ°æį® æ¸²æŁĵ åĪ° camera Texture Id çļĦ çº ¹ çĲĨ ï¼Į èĢĮ è¯¥ çº ¹ çĲĨ å·²ç»ı åĴĮ OpenGL çļĦ camera Texture Id ç»ĳå®ļ å¥½ äºĨ ï¼Į æīĢä»¥ ä¼ļ æĬĬ æĳ Ħ åĥı å¤´ æķ°æį® æ¸²æŁĵ åĪ° OpenGL ĊĠĠĠĠĠĠĠ Ġsurface Texture Ġ= ĠSurface Texture ( camera Texture Id ) ĊĠĠĠĠĠĠĠ Ġsurface Texture !!. setOn Frame Available Listener ( this ) ĊĠĠĠĠĠĠĠ Ġ// è¿ĻéĩĮ ä¼ļ å°Ĩ surface Texture åĴĮ çº ¹ çĲĨ id äº¤ ç»Ļ å¤ĸéĥ¨ çļĦ Camera è¿Ľè¡Į ç»ĳå®ļ ĊĠĠĠĠĠĠĠ Ġon Surface Created Listener ?. on Surface Created ( surface Texture !! , Ġf bo Texture id ) ĊĊĠĠĠĠĠĠĠ ĠglBind Texture ( GLES 1 1 Ext . GL _ TEXTURE _ EXTERNAL _ OES , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Changed ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġf bo Render ?. onChange ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġgl Viewport ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠMatrix . rotate M ( matrix , Ġ 0 , Ġ 9 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Surface Changed Ġwidth :$ width , height :$ height ") ĊĊĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ åħĪ ç»ĺ åĪ¶ åĪ° åĴĮ surface Texture ç»ĳ å®ļçļĦ camera Texture Id ï¼Į åĨį è®² çº ¹ çĲĨ è¾ĵåĩº åĪ° åĴĮ f bo ç»ĳ å®ļçļĦ f bo Texture id ï¼Į çĦ¶åĲİ f bo Texture id ä¼ł ç»Ļ f bo Render ç»ĺ åĪ¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Draw Frame () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ ĠLog . e ( TAG , Ġ" on Draw Frame ") ĊĠĠĠĠĠĠĠ Ġ// It Ġwill Ġimplicitly Ġbind Ġits Ġtexture Ġto Ġthe ĠGL _ TEXTURE _ EXTERNAL _ OES Ġtexture Ġtarget ĊĠĠĠĠĠĠĠ Ġ// æīĢä»¥ å°± ä¸į çĶ¨ åľ¨ è¿ĻéĩĮ ç»ĳå®ļ GL _ TEXTURE _ EXTERNAL _ OES çº ¹ çĲĨ çĽ®æłĩ ï¼Ī çĽ¸ å½ĵ äºİ ç»ĳå®ļ äºĨ camera Texture Id ï¼īï¼Į åĽłä¸º ä¹ĭåīį ç»ĳå®ļ äºĨ æĳ Ħ åĥı å¤´ ï¼Į æīĢä»¥ è¿ĻéĩĮ å°Ĩ æĳ Ħ åĥı å¤´ é¢Ħ è§Ī çĶ» éĿ¢ æķ°æį® æ¸²æŁĵ åĪ° camera Texture Id å¯¹åºĶçļĦ çº ¹ çĲĨ ĊĠĠĠĠĠĠĠ Ġ// update TexImage Ġmay Ġonly Ġbe Ġ Ġcalled Ġon Ġthe Ġthread Ġwith Ġthe ĠOpenGL ĠES Ġcontext Ġthat Ġcontains Ġthe Ġtexture Ġobject Ġ åį³ ç»ĳå®ļ OpenGL ĠContext çļĦ çº¿ç¨ĭ ĊĠĠĠĠĠĠĠ Ġsurface Texture ?. update TexImage () ĊĊĠĠĠĠĠĠĠ Ġgl Clear ( GL _ COLOR _ BUFFER _ BIT ) ĊĠĠĠĠĠĠĠ Ġgl Clear Color ( 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġgl Use Program ( program ) ĊĠĠĠĠĠĠĠ Ġ// æ¸²æŁĵ åĪ° f bo çļĦ çº ¹ çĲĨ å° º å¯ ¸ è¦ģ åĴĮ f bo ä¸Ģèĩ´ ĊĠĠĠĠĠĠĠ Ġgl Viewport ( 0 , Ġ 0 , Ġscreen Width , Ġscreen Height ) ĊĠĠĠĠĠĠĠ Ġ// è®¾ç½® é¡¶ çĤ¹ çĿĢ èī² åĻ¨ ä¸ŃçļĦ u Matrix Location ä¸º matrix ĊĠĠĠĠĠĠĠ Ġgl Uniform Matrix 4 fv ( u Matrix Location , Ġ 1 , Ġfalse , Ġmatrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// ç»ĳå®ļ f bo åĲİ ï¼Į åĲİ éĿ¢ æ¸²æŁĵ åĪ° çº ¹ çĲĨ çļĦæķ°æį® éĥ½ä¼ļ æ¸²æŁĵ åĪ° åĴĮ f bo ç»ĳ å®ļçļĦ çº ¹ çĲĨ ä¸Ĭ ãĢĤ è¿ĻéĩĮ æ¸²æŁĵ åĪ° surface Texture ä¸Ĭ çļĦæķ°æį® éĥ½ä¼ļ ç¦» å±ı æ¸²æŁĵ åĪ° f bo ç»ĳ å®ļçļĦ çº ¹ çĲĨ ä¸Ĭ ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġf bo Id ) ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġv bo Id ) ĊĊĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( v Position ) ĊĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Position , Ġ 2 , ĠGL _ FLOAT , Ġfalse , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( f Position ) ĊĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf Position , Ġ 2 , ĠGL _ FLOAT , Ġfalse , Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data . size Ġ* Ġ 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġgl Draw Arrays ( GL _ TRI ANGLE _ STRIP , Ġ 0 , Ġ 4 ) ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// åĪĩæį¢ åĪ° å±ı å¹ķ çļĦ å¸ § ç¼ĵ åĨ² ĊĠĠĠĠĠĠĠ ĠglBind Framebuffer ( GL _ FRAMEBUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ f bo ä¸ŃçļĦ æķ°æį® æĺ¾ç¤º åĪ° å±ı å¹ķ çļĦ å° º å¯ ¸ è¦ģ åĴĮ å®ŀéĻħ å±ı å¹ķ å° º å¯ ¸ ä¸Ģèĩ´ ĊĠĠĠĠĠĠĠ Ġf bo Render ?. onChange ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ// ä¼łåħ¥ f bo ç»ĳ å®ļçļĦ çº ¹ çĲĨ . åīį éĿ¢ éĥ½æĺ¯ ç»ĺ åĪ¶ åĪ° camera Texture Id çļĦ çº ¹ çĲĨ ï¼Į çİ°åľ¨ å°Ĩ f bo ä¸ŃçļĦ æķ°æį® æ¸²æŁĵ åĪ° å±ı å¹ķ ĊĠĠĠĠĠĠĠ Ġf bo Render ?. on Draw ( f bo Texture id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Surface Created Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Surface Created ( surface Texture : ĠSurface Texture , Ġtexture Id : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Frame Available ( p 0 : ĠSurface Texture ?) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Matrix () Ġ{ ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( matrix , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Angle ( angle : ĠFloat , Ġx : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åĪ©çĶ¨ OpenGL è¿Ľè¡Į åĽ¾åĥı çļĦ æĹ ĭ è½¬ ï¼Į ä½¿ å¾Ĺ é¢Ħ è§Ī çĶ» éĿ¢ æĹ ĭ è½¬ åĪ° æŃ£ç¡® çļĦ æĸ¹åĲĳ ï¼Ī åĴĮ æīĭæľº å±ı å¹ķ ä¸Ģèĩ´ çļĦ æĸ¹åĲĳ ï¼ī ĊĠĠĠĠĠĠĠ ĠMatrix . rotate M ( matrix , Ġ 0 , Ġangle , Ġx , Ġy , Ġz ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Texture Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġf bo Texture id ĊĠĠĠ Ġ} Ċ }