package Ġcom . hu jun . my application . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . opengl . GLES 3 2 Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġjava . lang . IllegalStateException Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġj un hu Ġon Ġ 2 0 1 9 - 1 1 - 2 9 Ċ Ġ*/ Ċ class ĠShader Program ( var Ġcontext : ĠContext , Ġvar Ġvertex ResourceId : ĠInt , Ġvar Ġfragment ResourceId : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġm Program Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġthis :: class . java . name . replace ("${ '$ '} Companion ","" ). split (". "). last () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¼ĸè¯ĳ shader ĊĠĠĠĠ Ġ* Ġ@ param Ġshader Ġshader çļĦä»£çłģ ĊĠĠĠĠ Ġ* Ġ@ param Ġtype ĠGL _ VERTEX _ SHADER æĪĸ GL _ FRAGMENT _ SHADER ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcompile Shader ( shader : ĠString , Ġtype : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshader Id Ġ= ĠGLES 3 2 . gl Create Shader ( type ) ĊĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Shader Source ( shader Id , Ġshader ) ĊĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Compile Shader ( shader Id ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġstatus Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 3 2 . glGet Shader iv ( shader Id , ĠGLES 3 2 . GL _ COMPILE _ STATUS , Ġstatus , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( status [ 0 ] Ġ!= ĠGLES 3 2 . GL _ TRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck GLE rror (" compile Shader ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinfo Ġ= ĠGLES 3 2 . glGet Shader Info Log ( shader Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" compile Shader å¤±è´¥ Ġ$ type Ġinfo :$ info ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshader Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlink Program ( v Shader : ĠInt , Ġf Shader : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprogram Ġ= ĠGLES 3 2 . gl Create Program () ĊĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Attach Shader ( program , Ġv Shader ) ĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Attach Shader ( program , Ġf Shader ) ĊĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Link Program ( program ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġstatus Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 3 2 . glGet Program iv ( program , ĠGLES 3 2 . GL _ LINK _ STATUS , Ġstatus , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( status [ 0 ] Ġ!= ĠGLES 3 2 . GL _ TRUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinfo Ġ= ĠGLES 3 2 . glGet Shader Info Log ( program ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" link Program å¤±è´¥ Ġ: Ġ${ status [ 0 ]}, info :$ info ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Delete Shader ( v Shader ) ĊĠĠĠĠĠĠĠ ĠGLES 3 2 . gl Delete Shader ( f Shader ) ĊĠĠĠĠĠĠĠ Ġreturn Ġprogram ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlink Program () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġv Shader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShader Resource Loader . load Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex ResourceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġf Shader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShader Resource Loader . load Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment ResourceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( v Shader ) Ġ&& Ġ! TextUtils . isEmpty ( f Shader )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv Shader Id Ġ= Ġcompile Shader ( v Shader , ĠGLES 3 2 . GL _ VERTEX _ SHADER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġf Shader Id Ġ= Ġcompile Shader ( f Shader , ĠGLES 3 2 . GL _ FRAGMENT _ SHADER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Program Ġ= Ġlink Program ( v Shader Id , Ġf Shader Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Program > 0 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" link Program : Ġ æĪĲåĬŁ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" link Program : Ġ å¤±è´¥ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġcheck GLE rror ( msg : ĠString Ġ= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġerror Ġ= ĠGLES 3 2 . glGet Error () ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= ĠGLES 3 2 . GL _ NO _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"$ msg Ġcheck GLE rror : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }