package Ġcom . example . new openg lst udy . img texture čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . opengl . GLES 2 0 č Ċ import Ġandroid . util . Log č Ċ import Ġandroidx . annotation . Raw Res č Ċ import Ġjava . io . BufferedReader č Ċ import Ġjava . io . InputStream Reader č Ċ import Ġjava . lang . StringBuilder čĊč Ċ /** čĊ Ġ* Ġstatus Ġ 0 Ġis Ġerror čĊ Ġ*/ č Ċ class ĠShader Util Ġ{ čĊĠĠĠ Ġcompanion Ġobject { čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Shader Util " čĊĠĠĠĠĠĠĠ Ġ@ Jvm Static čĊĠĠĠĠĠĠĠ Ġfun Ġlink Program ( context : ĠContext ,@ Raw Res Ġvertex Shader Raw Id : Int ,@ Raw Res Ġfragment Shader Raw Id : Int ): Int { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Shader Ġ= Ġload Shader ( get Shader Source ( context , vertex Shader Raw Id ), GLES 2 0 . GL _ VERTEX _ SHADER ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Shader Ġ= Ġload Shader ( get Shader Source ( context , fragment Shader Raw Id ), GLES 2 0 . GL _ FRAGMENT _ SHADER ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlink Program ( vertex Shader , fragment Shader ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Shader Source ( context : ĠContext ,@ Raw Res Ġraw Id : Int ): String { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontext . resources . open Raw Resource ( raw Id ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( inputStream )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Line : String ? čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( reader . readLine (). apply Ġ{ Ġnext Line Ġ= Ġthis Ġ} Ġ!= Ġnull ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( nextLine ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ("\ n ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . close () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠstringBuilder . toString () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlink Program ( vertex Shader : Int , fragment Shader : Int ): Int { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠGLES 2 0 . gl Create Program () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( program Ġ== Ġ 0 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," GLES 2 0 . gl Create Program () Ġfail ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( vertex Shader Ġ!= Ġ 0 Ġ&& Ġfragment Shader Ġ!= Ġ 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," success ĠĠĠĠ Ġvertex Shader Ġ= Ġ$ vertex Shader Ġ, Ġfragment Shader Ġ= Ġ$ fragment Shader ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( program , vertex Shader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( program , fragment Shader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Link Program ( program ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Status Ġ= ĠInt Array ( 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glGet Program iv ( program , GLES 2 0 . GL _ LINK _ STATUS , link Status , 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link Status [ 0 ] Ġ== Ġ 0 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," GLES 2 0 . gl Link Program ( program ) Ġfail ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Program ( program ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," vertex Shader Ġ= Ġ$ vertex Shader Ġ, Ġfragment Shader Ġ= Ġ$ fragment Shader ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprogram čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Shader ( shader Source : String , shader Type : Int ): Int { čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshader Ġ= ĠGLES 2 0 . gl Create Shader ( shader Type ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shader Ġ== Ġ 0 ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," GLES 2 0 . gl Create Shader ($ shader Type ) Ġfail , Ġshader Ġ= Ġ 0 ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Shader Source ( shader , shader Source ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Compile Shader ( shader ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompile Status Ġ= ĠInt Array ( 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glGet Shader iv ( shader , GLES 2 0 . GL _ COMPILE _ STATUS , compile Status , 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compile Status [ 0 ] Ġ!= ĠGLES 2 0 . GL _ TRUE ){ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ" Result Ġof Ġcompile Ġsource Ġ\ n " Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ shader Source Ġ\ n " Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" --- gl Shader Info Log --- \ n " Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glGet Shader Info Log ( shader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG ," GLES 2 0 . gl Compile Shader ( shader :$ shader ) Ġfail ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Shader ( shader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġshader čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊč Ċ }