package com.glview.graphics.shader; import com.glview.libgdx.graphics.glutils.ShaderProgram; import com.glview.libgdx.graphics.glutils.ShaderProgram.HandleInfo; //加载顶点Shader与片元Shader的工具类 public class BreathLightShader extends SimpleTextureShader{ HandleInfo mAlphaAniUniHandle; HandleInfo mDrawInnerrUniHandle; public BreathLightShader() { mAlphaAniUniHandle = new HandleInfo("u_alphaAni"); mDrawInnerrUniHandle = new HandleInfo("u_drawinnerr"); } /*public void useShaderDrawMesh(GLCanvas canvas, UploadedTexture texture, int x, int y, int w, int h, Rect inner, float progressL, float progressT, float progressR, float progressB){ canvas.setShader(this); mShaderProgram.setUniformf(mDrawInnerrUniHandle, inner.left - x, inner.top - y, inner.right - x, inner.bottom - y); mShaderProgram.setUniformf(mAlphaAniUniHandle, progressL, progressT, progressR, progressB); } public void useShaderDrawTexture(GLCanvas canvas, UploadedTexture texture, int x, int y, int w, int h, Rect inner, float progressL, float progressT, float progressR, float progressB){ canvas.setShader(this); mShaderProgram.setUniformf(mDrawInnerrUniHandle, inner.left - x, inner.top - y, inner.right - x, inner.bottom - y); mShaderProgram.setUniformf(mAlphaAniUniHandle, progressL, progressT, progressR, progressB); }*/ /* @Override public String createVertexShader() { String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + "attribute vec4 " + ShaderProgram.TEXCOORD_ATTRIBUTE + ";\n" // + "uniform mat4 u_projTrans;\n" // + "uniform vec4 u_ColorTotal;\n" // + "uniform vec4 u_drawinnerr;\n" + "varying vec4 v_color;\n" // + "varying vec4 v_pos;\n" // + "varying vec2 v_texCoords;\n" // + "varying vec4 v_poslp;\n" // + "varying vec4 v_posrb;\n" // + "\n" // + "void main()\n" // + "{\n" // + " v_color = u_ColorTotal*" + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + " vec4 a_tex4V = vec4("+ ShaderProgram.TEXCOORD_ATTRIBUTE + ".x," + ShaderProgram.TEXCOORD_ATTRIBUTE + ".y, 0, 1); \n" + " vec4 a_tex4VT = a_tex4V;\n" // + " v_texCoords = vec2(a_tex4VT.x, a_tex4VT.y); \n" + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + " v_poslp = u_projTrans*vec4(u_drawinnerr.x, u_drawinnerr.y, 0, 1.0);\n" + " v_posrb = u_projTrans*vec4(u_drawinnerr.z, u_drawinnerr.w, 0, 1.0);\n" + " v_pos = gl_Position;\n" + "}\n"; return vertexShader; } @Override public String createFragmentShader() { String fragmentShader = "#define LOWP lowp\n" // + "precision mediump float;\n" // + "uniform vec4 u_alphaAni;\n" // + "uniform mat4 u_projTrans;\n" // + "varying LOWP vec4 v_color;\n" // + "varying vec4 v_pos;\n" // + "varying vec2 v_texCoords;\n" // + "varying vec4 v_poslp;\n" // + "varying vec4 v_posrb;\n" // + "uniform sampler2D u_texture;\n" // + "float xCenter;\n" // + "float yCenter;\n" // + "float radi;\n" // + "float alpha;\n" // + "vec2 pt;\n" // + "float alphaInterpolate(float startp, float endp, float stratAlpha, float endAlpha, float p)\n" +"{\n" +" float lamta = 0.0;\n" +" if(p < startp)\n" +" {\n" +" return stratAlpha; \n" +" }\n" +" if(p > endp)\n" +" {\n" +" return endAlpha; \n" +" }\n" +" if(startp == endp)\n" +" {\n" +" return endAlpha; \n" +" }\n" +" lamta = (p - startp)/(endp - startp);\n" +" return stratAlpha + (endAlpha - stratAlpha)*lamta;\n" +"}\n" + "float alphaHVLine(float startp, float endp, float stratAlpha, float endAlpha, float p)\n" +"{\n" +" if(p < (startp + endp)*0.5)\n" +" {\n" +" return alphaInterpolate(startp, (startp + endp)*0.5, stratAlpha, 1.0, p); \n" +" }\n" +" return alphaInterpolate((startp + endp)*0.5, endp, 1.0, endAlpha, p); \n" +"}\n" + "void main()\n"// + "{\n" // + " vec4 rb = v_posrb;\n" + " vec4 lp = v_poslp;\n" + " alpha = 0.0;\n" + " pt.x = v_pos.x;\n" + " pt.y = v_pos.y;\n" + " if(pt.y > lp.y)\n" + " {\n" + " alpha = alphaHVLine(lp.x, rb.x, u_alphaAni.x, u_alphaAni.y, pt.x);\n" + " }\n" + " else if(pt.y < rb.y)\n" + " {\n" + " alpha = alphaHVLine(lp.x, rb.x, u_alphaAni.z, u_alphaAni.w, pt.x);\n" + " }\n" + " else if(pt.x < lp.x)\n" + " {\n" + " alpha = alphaHVLine(rb.y, lp.y, u_alphaAni.z, u_alphaAni.x, pt.y);\n" + " }\n" + " else if(pt.x > rb.x)\n" + " {\n" + " alpha = alphaHVLine(rb.y, lp.y, u_alphaAni.w, u_alphaAni.y, pt.y);\n" + " }\n" + " else\n" + " {\n" + " alpha = 1.0;\n" + " }\n" + " gl_FragColor = v_color * texture2D(u_texture, v_texCoords.xy)*alpha;\n" + "}"; return fragmentShader; } */ @Override protected String generateVertexShader() { String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + ";\n" // + "uniform mat4 u_projTrans;\n" // + "uniform vec4 u_ColorTotal;\n" // + "uniform vec4 u_drawinnerr;\n" + "varying vec4 v_color;\n" // + "varying vec4 v_pos;\n" // + "varying vec2 v_texCoords;\n" // + "varying vec4 v_poslp;\n" // + "varying vec4 v_posrb;\n" // + "\n" // + "void main()\n" // + "{\n" // + " v_color = u_ColorTotal*" + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + " v_texCoords = "+ ShaderProgram.TEXCOORD_ATTRIBUTE + "; \n" + " gl_Position = u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + " v_poslp = u_projTrans*vec4(u_drawinnerr.x, u_drawinnerr.y, 0, 1.0);\n" + " v_posrb = u_projTrans*vec4(u_drawinnerr.z, u_drawinnerr.w, 0, 1.0);\n" + " v_pos = gl_Position;\n" + "}\n"; return vertexShader; } @Override protected String generateFragmentShader() { String fragmentShader = "#define LOWP lowp\n" // + "precision mediump float;\n" // + "uniform vec4 u_alphaAni;\n" // + "uniform mat4 u_projTrans;\n" // + "varying LOWP vec4 v_color;\n" // + "varying vec4 v_pos;\n" // + "varying vec2 v_texCoords;\n" // + "varying vec4 v_poslp;\n" // + "varying vec4 v_posrb;\n" // + "uniform sampler2D u_texture;\n" // + "float xCenter;\n" // + "float yCenter;\n" // + "float radi;\n" // + "float alpha;\n" // + "vec2 pt;\n" // + "float alphaInterpolate(float startp, float endp, float stratAlpha, float endAlpha, float p)\n" +"{\n" +" float lamta = 0.0;\n" +" if(p < startp)\n" +" {\n" +" return stratAlpha; \n" +" }\n" +" if(p > endp)\n" +" {\n" +" return endAlpha; \n" +" }\n" +" if(startp == endp)\n" +" {\n" +" return endAlpha; \n" +" }\n" +" lamta = (p - startp)/(endp - startp);\n" +" return stratAlpha + (endAlpha - stratAlpha)*lamta;\n" +"}\n" + "float alphaHVLine(float startp, float endp, float stratAlpha, float endAlpha, float p)\n" +"{\n" +" if(p < (startp + endp)*0.5)\n" +" {\n" +" return alphaInterpolate(startp, (startp + endp)*0.5, stratAlpha, 1.0, p); \n" +" }\n" +" return alphaInterpolate((startp + endp)*0.5, endp, 1.0, endAlpha, p); \n" +"}\n" + "void main()\n"// + "{\n" // + " vec4 rb = v_posrb;\n" + " vec4 lp = v_poslp;\n" + " alpha = 0.0;\n" + " pt.x = v_pos.x;\n" + " pt.y = v_pos.y;\n" + " if(pt.y > lp.y)\n" + " {\n" + " alpha = alphaHVLine(lp.x, rb.x, u_alphaAni.x, u_alphaAni.y, pt.x);\n" + " }\n" + " else if(pt.y < rb.y)\n" + " {\n" + " alpha = alphaHVLine(lp.x, rb.x, u_alphaAni.z, u_alphaAni.w, pt.x);\n" + " }\n" + " else if(pt.x < lp.x)\n" + " {\n" + " alpha = alphaHVLine(rb.y, lp.y, u_alphaAni.z, u_alphaAni.x, pt.y);\n" + " }\n" + " else if(pt.x > rb.x)\n" + " {\n" + " alpha = alphaHVLine(rb.y, lp.y, u_alphaAni.w, u_alphaAni.y, pt.y);\n" + " }\n" + " else\n" + " {\n" + " alpha = 1.0;\n" + " }\n" + " gl_FragColor = v_color * texture2D(u_texture, v_texCoords.xy)*alpha;\n" + "}"; return fragmentShader; } }