1006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk/* 2006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 4006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * you may not use this file except in compliance with the License. 6006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * You may obtain a copy of the License at 7006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 8006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * 10006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * See the License for the specific language governing permissions and 14006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk * limitations under the License. 15006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk */ 16006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 17006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 18d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukpackage com.android.testapp; 19006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 20be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchoukimport java.util.ArrayList; 21be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 22d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchoukimport com.android.scenegraph.*; 23be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 24006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.content.res.Resources; 25006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.Bitmap; 26006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.graphics.BitmapFactory; 27006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.os.AsyncTask; 28006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.*; 29006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Allocation.MipmapControl; 30006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Element.Builder; 31006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Font.Style; 32006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.Program.TextureType; 33006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc; 34006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchoukimport android.util.Log; 35006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 36b6e9dad7823fd5458f381530c09bd71fcfcef98fAlex Sakhartchoukclass FullscreenBlur { 37006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 38e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur0Color; 39e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur0Depth; 40e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur1Color; 41e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur1Depth; 42e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur2Color; 43e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static TextureRenderTarget sRenderTargetBlur2Depth; 44006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 455121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_BlurH; 465121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_BlurV; 475121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_SelectColor; 485121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static FragmentShader mPF_Texture; 495121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static VertexShader mPV_Paint; 505121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static VertexShader mPV_Blur; 51006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 52e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static int targetWidth; 53e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static int targetHeight; 54e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk 55006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk // This is only used when full screen blur is enabled 56006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk // Basically, it's the offscreen render targets 57006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk static void createRenderTargets(RenderScriptGL rs, int w, int h) { 58e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk targetWidth = w/8; 59e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk targetHeight = h/8; 60006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk Type.Builder b = new Type.Builder(rs, Element.RGBA_8888(rs)); 61e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk Type renderType = b.setX(targetWidth).setY(targetHeight).create(); 62ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk int usage = Allocation.USAGE_GRAPHICS_TEXTURE | Allocation.USAGE_GRAPHICS_RENDER_TARGET; 63e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur0Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 64e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur1Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 65e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur2Color = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 66ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 67ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk b = new Type.Builder(rs, Element.createPixel(rs, Element.DataType.UNSIGNED_16, 68ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk Element.DataKind.PIXEL_DEPTH)); 69e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk renderType = b.setX(targetWidth).setY(targetHeight).create(); 70ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk usage = Allocation.USAGE_GRAPHICS_RENDER_TARGET; 71e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur0Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 72e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur1Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 73e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk sRenderTargetBlur2Depth = new TextureRenderTarget(Allocation.createTyped(rs, renderType, usage)); 74006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 75006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 76ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk static void addOffsets(Renderable quad, float advance) { 77ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset0", - advance * 2.5f)); 78ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset1", - advance * 0.5f)); 79ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset2", advance * 1.5f)); 80ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad.appendSourceParams(new Float4Param("blurOffset3", advance * 3.5f)); 81ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk } 82006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 83e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk static RenderPass addPass(Scene scene, Camera cam, TextureRenderTarget color, TextureRenderTarget depth) { 84ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderPass pass = new RenderPass(); 85ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setColorTarget(color); 86ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setDepthTarget(depth); 87ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setShouldClearColor(false); 88ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk pass.setShouldClearDepth(false); 896f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk pass.setCamera(cam); 90ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk scene.appendRenderPass(pass); 91ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk return pass; 92ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk } 93006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 946f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk static void addBlurPasses(Scene scene, RenderScriptGL rs, Camera cam) { 95ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 96ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ArrayList<RenderableBase> allDraw = scene.getRenderables(); 97ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk int numDraw = allDraw.size(); 98006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 99ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramRaster cullNone = ProgramRaster.CULL_NONE(rs); 100ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramStore blendAdd = SceneManager.BLEND_ADD_DEPTH_NONE(rs); 101ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramStore blendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(rs); 102006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 103ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, blendAdd, cullNone); 104ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState selectCol = new RenderState(mPV_Blur, mPF_SelectColor, blendNone, cullNone); 105ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState hBlur = new RenderState(mPV_Blur, mPF_BlurH, blendNone, cullNone); 106ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk RenderState vBlur = new RenderState(mPV_Blur, mPF_BlurV, blendNone, cullNone); 107006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 108ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Renders the scene off screen 1096f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass blurSourcePass = addPass(scene, cam, 110ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Color, 111ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur0Depth); 112006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f)); 113006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setShouldClearColor(true); 114006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setClearDepth(1.0f); 115006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk blurSourcePass.setShouldClearDepth(true); 116006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk for (int i = 0; i < numDraw; i ++) { 117684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk blurSourcePass.appendRenderable((Renderable)allDraw.get(i)); 118006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 119ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 120ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Pass for selecting bright colors 1216f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass selectColorPass = addPass(scene, cam, 122ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Color, 123ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Depth); 124f92189d2aea9856c11c26ebe392cd53dd969c0b8Alex Sakhartchouk Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadS", selectCol); 125e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur0Color)); 126684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk selectColorPass.appendRenderable(quad); 127be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 128ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Horizontal blur 1296f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass horizontalBlurPass = addPass(scene, cam, 130ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Color, 131ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur1Depth); 132ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad = sceneManager.getRenderableQuad("ScreenAlignedQuadH", hBlur); 133e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur2Color)); 134e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk addOffsets(quad, 1.0f / (float)targetWidth); 135684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk horizontalBlurPass.appendRenderable(quad); 136be5bdeb9471c4a04905edd34e6d3560315293427Alex Sakhartchouk 137ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Vertical Blur 1386f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass verticalBlurPass = addPass(scene, cam, 139ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Color, 140ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk sRenderTargetBlur2Depth); 141ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk quad = sceneManager.getRenderableQuad("ScreenAlignedQuadV", vBlur); 142e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur1Color)); 143e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk addOffsets(quad, 1.0f / (float)targetHeight); 144684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk verticalBlurPass.appendRenderable(quad); 145006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 146006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 147ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk // Additively renders the blurred colors on top of the scene 1486f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk static void addCompositePass(Scene scene, RenderScriptGL rs, Camera cam) { 149ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager sceneManager = SceneManager.getInstance(); 150006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk RenderState drawTex = new RenderState(mPV_Blur, mPF_Texture, 151ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk SceneManager.BLEND_ADD_DEPTH_NONE(rs), 152ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk ProgramRaster.CULL_NONE(rs)); 153ce047cb47b761f00593f247a3901fe8155371d47Alex Sakhartchouk 1546f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk RenderPass compositePass = addPass(scene, cam, null, null); 1556f31c36a3dbe5e61644ec39c4fcad0284d50e4f1Alex Sakhartchouk Renderable quad = sceneManager.getRenderableQuad("ScreenAlignedQuadComposite", drawTex); 156e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk quad.appendSourceParams(new TextureParam("color", sRenderTargetBlur2Color)); 157684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk compositePass.appendRenderable(quad); 158006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 159006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 1605121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static private FragmentShader getShader(Resources res, RenderScriptGL rs, 1615121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk int resID, Type constants) { 1625121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk FragmentShader.Builder fb = new FragmentShader.Builder(rs); 1635121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.setShader(res, resID); 1645121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.addTexture(TextureType.TEXTURE_2D, "color"); 1655121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk if (constants != null) { 1665121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk fb.setObjectConst(constants); 1675121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk } 1685121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk FragmentShader prog = fb.create(); 169d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk prog.getProgram().bindSampler(Sampler.CLAMP_LINEAR(rs), 0); 1705121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk return prog; 1715121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk } 1725121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk 1735121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk static void initShaders(Resources res, RenderScriptGL rs) { 1744bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk ScriptField_BlurOffsets blurConst = new ScriptField_BlurOffsets(rs, 1); 1755121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk VertexShader.Builder vb = new VertexShader.Builder(rs); 1764bda82de0bca754f3ce387e9968170c5122241a9Alex Sakhartchouk vb.addInput(ScriptField_VertexShaderInputs.createElement(rs)); 177006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk vb.setShader(res, R.raw.blur_vertex); 178006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk mPV_Blur = vb.create(); 179006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 1805121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_Texture = getShader(res, rs, R.raw.texture, null); 181d4cb9c587c23e3c24d928b0ac1a4de5679846f93Alex Sakhartchouk mPF_Texture.getProgram().bindSampler(Sampler.WRAP_LINEAR_MIP_LINEAR(rs), 0); 1825121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_BlurH = getShader(res, rs, R.raw.blur_h, blurConst.getAllocation().getType()); 1835121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_BlurV = getShader(res, rs, R.raw.blur_v, blurConst.getAllocation().getType()); 1845121da171e0215f3bcd5d1fb0b147e7ed3c295a9Alex Sakhartchouk mPF_SelectColor = getShader(res, rs, R.raw.select_color, null); 185006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk } 186006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 187006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk} 188006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 189006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 190006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 191006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 192006ecdcf16a5446adb781e55d65ed22469bbed47Alex Sakhartchouk 193