初步完善外发光
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| // Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.   | ||||
| // 内发光特效 | ||||
| // 原理: 采样周边像素alpha取平均值,叠加发光效果 | ||||
| // 外发光特效 | ||||
| // 原理:采样周边像素alpha取平均值,给外部加发光效果(1-col.a可避免内部发光) | ||||
| CCEffect %{ | ||||
|   techniques: | ||||
|   - passes: | ||||
| @@ -92,7 +92,7 @@ CCProgram fs %{ | ||||
|   uniform sampler2D texture; | ||||
|   #endif | ||||
|  | ||||
|   #if SHOW_INNER_GLOW | ||||
|   #if SHOW_OUTTER_GLOW | ||||
|  | ||||
|   uniform glow { | ||||
|     // 发光颜色 | ||||
| @@ -127,8 +127,6 @@ CCProgram fs %{ | ||||
|    * @return average alpha [0.0, 1.0] | ||||
|    */ | ||||
|   float getAverageAlpha(float dist) { | ||||
|     | ||||
|  | ||||
|     float totalAlpha = 0.0; | ||||
|     // 以30度为一个单位,那么「周边一圈」就由0到360度中共计12个点的组成 | ||||
|     totalAlpha += getColorAlpha(0.0, dist); | ||||
| @@ -155,14 +153,14 @@ CCProgram fs %{ | ||||
|       return 0.0; | ||||
|     } | ||||
|  | ||||
|     // 因为我们是要做内发光,所以如果点本来是透明的或者接近透明的 | ||||
|     // 那么就意味着这个点是图像外的透明点或者图像内透明点(如空洞)之类的 | ||||
|     // 内发光的话,这些透明点我们不用处理,让它保持原样,否则就是会有内描边或者一点扩边的效果 | ||||
|     // 同时也是提前直接结束,减少计算量 | ||||
|     vec4 srcColor = texture(texture, v_uv0); | ||||
|     if (srcColor.a <= glowThreshold) { | ||||
|       return srcColor.a; | ||||
|     }  | ||||
|     // // 因为我们是要做内发光,所以如果点本来是透明的或者接近透明的 | ||||
|     // // 那么就意味着这个点是图像外的透明点或者图像内透明点(如空洞)之类的 | ||||
|     // // 内发光的话,这些透明点我们不用处理,让它保持原样,否则就是会有内描边或者一点扩边的效果 | ||||
|     // // 同时也是提前直接结束,减少计算量 | ||||
|     // vec4 srcColor = texture(texture, v_uv0); | ||||
|     // if (srcColor.a <= glowThreshold) { | ||||
|     //   return srcColor.a; | ||||
|     // }  | ||||
|  | ||||
|     // 将传入的指定距离,平均分成10圈,求出每一圈的平均透明度, | ||||
|     // 然后求和取平均值,那么就可以得到该点的平均透明度 | ||||
| @@ -198,42 +196,42 @@ CCProgram fs %{ | ||||
|  | ||||
|     gl_FragColor = o; | ||||
|  | ||||
|     #if SHOW_INNER_GLOW | ||||
|       // 目标颜色(图像) | ||||
|       vec4 color_dest = o; | ||||
|  | ||||
|     #if SHOW_OUTTER_GLOW | ||||
|       // 获取发光透明度 | ||||
|       // 此时我们得到的是内部透明度为1,靠近边缘的为接近0的透明度,其他位置为0的透明度 | ||||
|       float alpha = getGlowAlpha(); | ||||
|  | ||||
|       // 而内发光是从边缘开始的,那么什么算是边缘呢? | ||||
|       // 如果图像边缘有大量渐变,那么如果我们取大于 0.0 点就算是图像内的话,那么可能边缘会出现锯齿 | ||||
|       // 因此为了确定边缘,引入了发光阈值,我们只需要比较一下发光阈值就可以,大于发光阈值的点都是(图像内)发光点 | ||||
|       if (alpha > glowThreshold) { | ||||
|       // // 而外发光是从边缘开始的,那么什么算是边缘呢? | ||||
|       // // 一般图像边缘是存在渐变,即从图像内 1.0-> 0.0 图像外,那么发光边缘我们可以这样子定义 | ||||
|       // // 当该点的透明度小于一个阈值,那么我们就当该点为一个发光点 | ||||
|       // if (alpha <= glowThreshold) { | ||||
|  | ||||
|         // 内发光是从边缘发光的,是需要内部透明度为0,靠近边缘的接近1的透明度 | ||||
|         // 因此我们需要翻转一下透明度 | ||||
|         alpha = 1.0 - alpha; | ||||
|       //   // 给点调料,让靠近边缘的更加亮 | ||||
|       //   alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0; | ||||
|       // } else { | ||||
|       //   // 然后这里大于阈值的基本就是便是图像本身,不需要发光,那么将发光透明度置为0 | ||||
|       //   alpha = 0.0; | ||||
|       // } | ||||
|  | ||||
|         // 给点调料,让靠近边缘的更加亮 | ||||
|         alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0; | ||||
|       } | ||||
|       // 源颜色(内发光) | ||||
|       vec4 color_src = glowColor * alpha; | ||||
|       // 给点调料,让靠近边缘的更加亮 | ||||
|       alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0; | ||||
|       // 外发光颜色 | ||||
|       vec4 color_dest = glowColor * alpha; | ||||
|       vec4 color_src = o; | ||||
|  | ||||
|       // 按照这个顺序,源颜色就是内发光颜色,目标颜色就是图案颜色色  | ||||
|       // 所以命名就是 color_src, color_dest | ||||
|  | ||||
|       // 按照混合颜色规则 http://docs.cocos.com/creator/manual/zh/advanced-topics/ui-auto-batch.html#blend-%E6%A8%A1%E5%BC%8F | ||||
|       // 要在图案上方,叠加一个内发光,将两者颜色混合起来,那么最终选择的混合模式如下: | ||||
|       // 本次我们将先画外发光作为背景,然后在上方放图像 | ||||
|       // | ||||
|       // (内发光)color_src: GL_SRC_ALPHA | ||||
|       // (原图像)color_dest: GL_ONE | ||||
|       // 按照混合颜色规则 http://docs.cocos.com/creator/manual/zh/advanced-topics/ui-auto-batch.html#blend-%E6%A8%A1%E5%BC%8F | ||||
|       // | ||||
|       // 最终选择的混合模式如下: | ||||
|       // | ||||
|       // (原图像)color_src: GL_SRC_ALPHA | ||||
|       // (外发光)color_dest: GL_ONE_MINUS_SRC_ALPHAA | ||||
|       //  | ||||
|       // 即最终颜色如下: | ||||
|       // color_src * GL_SRC_ALPHA + color_dest * GL_ONE | ||||
|       // color_src * GL_SRC_ALPHA + color_dest * GL_ONE_MINUS_SRC_ALPHAA | ||||
|  | ||||
|       gl_FragColor = color_src * color_src.a + color_dest; | ||||
|       gl_FragColor = color_src * color_src.a + color_dest * (1.0 - color_src.a); | ||||
|     #endif | ||||
|   } | ||||
| }% | ||||
|   | ||||
| @@ -5,11 +5,11 @@ | ||||
|     { | ||||
|       "glsl1": { | ||||
|         "vert": "\nprecision highp float;\nuniform mat4 cc_matViewProj;\nuniform mat4 cc_matWorld;\n\nattribute vec3 a_position;\nattribute vec4 a_color;\nvarying vec4 v_color;\n\n#if USE_TEXTURE\nattribute vec2 a_uv0;\nvarying vec2 v_uv0;\n#endif\n\nvoid main () {\n  vec4 pos = vec4(a_position, 1);\n\n  #if CC_USE_MODEL\n  pos = cc_matViewProj * cc_matWorld * pos;\n  #else\n  pos = cc_matViewProj * pos;\n  #endif\n\n  #if USE_TEXTURE\n  v_uv0 = a_uv0;\n  #endif\n\n  v_color = a_color;\n\n  gl_Position = pos;\n}\n", | ||||
|         "frag": "\nprecision highp float;\n\n#if USE_ALPHA_TEST\n  \n  uniform float alphaThreshold;\n#endif\n\nvoid ALPHA_TEST (in vec4 color) {\n  #if USE_ALPHA_TEST\n      if (color.a < alphaThreshold) discard;\n  #endif\n}\n\nvoid ALPHA_TEST (in float alpha) {\n  #if USE_ALPHA_TEST\n      if (alpha < alphaThreshold) discard;\n  #endif\n}\n\nvarying vec4 v_color;\n\n#if USE_TEXTURE\nvarying vec2 v_uv0;\nuniform sampler2D texture;\n#endif\n\n#if SHOW_INNER_GLOW\n\nuniform vec4 glowColor;\nuniform float glowColorSize;\nuniform float glowThreshold;\n\n/**\n * 获取指定角度方向,距离为xxx的像素的透明度\n *\n * @param angle 角度 [0.0, 360.0]\n * @param dist 距离 [0.0, 1.0]\n *\n * @return alpha [0.0, 1.0]\n */\nfloat getColorAlpha(float angle, float dist) {\n\n  float radian = angle * 0.01745329252;\n\n  vec4 color = texture2D(texture, v_uv0 + vec2(dist * cos(radian), dist * sin(radian))); \n  return color.a;\n}\n\n/**\n * 获取指定距离的周边像素的透明度平均值\n *\n * @param dist 距离 [0.0, 1.0]\n *\n * @return average alpha [0.0, 1.0]\n */\nfloat getAverageAlpha(float dist) {\n\n  float totalAlpha = 0.0;\n\n  totalAlpha += getColorAlpha(0.0, dist);\n  totalAlpha += getColorAlpha(30.0, dist);\n  totalAlpha += getColorAlpha(60.0, dist);\n  totalAlpha += getColorAlpha(90.0, dist);\n  totalAlpha += getColorAlpha(120.0, dist);\n  totalAlpha += getColorAlpha(150.0, dist);\n  totalAlpha += getColorAlpha(180.0, dist);\n  totalAlpha += getColorAlpha(210.0, dist);\n  totalAlpha += getColorAlpha(240.0, dist);\n  totalAlpha += getColorAlpha(270.0, dist);\n  totalAlpha += getColorAlpha(300.0, dist);\n  totalAlpha += getColorAlpha(330.0, dist);\n  return totalAlpha * 0.0833;\n\n}\n\n/**\n * 获取发光的透明度\n */\nfloat getGlowAlpha() {\n\n  if (glowColorSize == 0.0) {\n    return 0.0;\n  }\n\n  vec4 srcColor = texture2D(texture, v_uv0);\n  if (srcColor.a <= glowThreshold) {\n    return srcColor.a;\n  }\n\n  float totalAlpha = 0.0;\n  totalAlpha += getAverageAlpha(glowColorSize * 0.1);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.2);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.3);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.4);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.5);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.6);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.7);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.8);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.9);\n  totalAlpha += getAverageAlpha(glowColorSize * 1.0);\n  return totalAlpha * 0.1;\n}\n\n#endif\n\nvoid main () {\n  vec4 o = vec4(1, 1, 1, 1);\n\n  #if USE_TEXTURE\n  o *= texture2D(texture, v_uv0);\n    #if CC_USE_ALPHA_ATLAS_TEXTURE\n    o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;\n    #endif\n  #endif\n\n  o *= v_color;\n\n  ALPHA_TEST(o);\n\n  gl_FragColor = o;\n\n  #if SHOW_INNER_GLOW\n\n    vec4 color_dest = o;\n\n    float alpha = getGlowAlpha();\n\n    if (alpha > glowThreshold) {\n\n      alpha = 1.0 - alpha;\n\n      alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0;\n    }\n\n    vec4 color_src = glowColor * alpha;\n\n    gl_FragColor = color_src * color_src.a + color_dest;\n  #endif\n}\n" | ||||
|         "frag": "\nprecision highp float;\n\n#if USE_ALPHA_TEST\n  \n  uniform float alphaThreshold;\n#endif\n\nvoid ALPHA_TEST (in vec4 color) {\n  #if USE_ALPHA_TEST\n      if (color.a < alphaThreshold) discard;\n  #endif\n}\n\nvoid ALPHA_TEST (in float alpha) {\n  #if USE_ALPHA_TEST\n      if (alpha < alphaThreshold) discard;\n  #endif\n}\n\nvarying vec4 v_color;\n\n#if USE_TEXTURE\nvarying vec2 v_uv0;\nuniform sampler2D texture;\n#endif\n\n#if SHOW_OUTTER_GLOW\n\nuniform vec4 glowColor;\nuniform float glowColorSize;\n\n/**\n * 获取指定角度方向,距离为xxx的像素的透明度\n *\n * @param angle 角度 [0.0, 360.0]\n * @param dist 距离 [0.0, 1.0]\n *\n * @return alpha [0.0, 1.0]\n */\nfloat getColorAlpha(float angle, float dist) {\n\n  float radian = angle * 0.01745329252;\n\n  vec4 color = texture2D(texture, v_uv0 + vec2(dist * cos(radian), dist * sin(radian))); \n  return color.a;\n}\n\n/**\n * 获取指定距离的周边像素的透明度平均值\n *\n * @param dist 距离 [0.0, 1.0]\n *\n * @return average alpha [0.0, 1.0]\n */\nfloat getAverageAlpha(float dist) {\n  float totalAlpha = 0.0;\n\n  totalAlpha += getColorAlpha(0.0, dist);\n  totalAlpha += getColorAlpha(30.0, dist);\n  totalAlpha += getColorAlpha(60.0, dist);\n  totalAlpha += getColorAlpha(90.0, dist);\n  totalAlpha += getColorAlpha(120.0, dist);\n  totalAlpha += getColorAlpha(150.0, dist);\n  totalAlpha += getColorAlpha(180.0, dist);\n  totalAlpha += getColorAlpha(210.0, dist);\n  totalAlpha += getColorAlpha(240.0, dist);\n  totalAlpha += getColorAlpha(270.0, dist);\n  totalAlpha += getColorAlpha(300.0, dist);\n  totalAlpha += getColorAlpha(330.0, dist);\n  return totalAlpha * 0.0833;\n\n}\n\n/**\n * 获取发光的透明度\n */\nfloat getGlowAlpha() {\n\n  if (glowColorSize == 0.0) {\n    return 0.0;\n  }\n\n  float totalAlpha = 0.0;\n  totalAlpha += getAverageAlpha(glowColorSize * 0.1);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.2);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.3);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.4);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.5);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.6);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.7);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.8);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.9);\n  totalAlpha += getAverageAlpha(glowColorSize * 1.0);\n  return totalAlpha * 0.1;\n}\n\n#endif\n\nvoid main () {\n  vec4 o = vec4(1, 1, 1, 1);\n\n  #if USE_TEXTURE\n  o *= texture2D(texture, v_uv0);\n    #if CC_USE_ALPHA_ATLAS_TEXTURE\n    o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;\n    #endif\n  #endif\n\n  o *= v_color;\n\n  ALPHA_TEST(o);\n\n  gl_FragColor = o;\n\n  #if SHOW_OUTTER_GLOW\n\n    float alpha = getGlowAlpha();\n\n    alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0;\n\n    vec4 color_dest = glowColor * alpha;\n    vec4 color_src = o;\n\n    gl_FragColor = color_src * color_src.a + color_dest * (1.0 - color_src.a);\n  #endif\n}\n" | ||||
|       }, | ||||
|       "glsl3": { | ||||
|         "vert": "\nprecision highp float;\nuniform CCGlobal {\n  vec4 cc_time;\n\n  vec4 cc_screenSize;\n\n  vec4 cc_screenScale;\n\n  vec4 cc_nativeSize;\n\n  mat4 cc_matView;\n  mat4 cc_matViewInv;\n  mat4 cc_matProj;\n  mat4 cc_matProjInv;\n  mat4 cc_matViewProj;\n  mat4 cc_matViewProjInv;\n  vec4 cc_cameraPos;\n\n  vec4 cc_exposure;\n\n  vec4 cc_mainLitDir;\n\n  vec4 cc_mainLitColor;\n\n  vec4 cc_ambientSky;\n  vec4 cc_ambientGround;\n};\nuniform CCLocal {\n  mat4 cc_matWorld;\n  mat4 cc_matWorldIT;\n};\n\nin vec3 a_position;\nin vec4 a_color;\nout vec4 v_color;\n\n#if USE_TEXTURE\nin vec2 a_uv0;\nout vec2 v_uv0;\n#endif\n\nvoid main () {\n  vec4 pos = vec4(a_position, 1);\n\n  #if CC_USE_MODEL\n  pos = cc_matViewProj * cc_matWorld * pos;\n  #else\n  pos = cc_matViewProj * pos;\n  #endif\n\n  #if USE_TEXTURE\n  v_uv0 = a_uv0;\n  #endif\n\n  v_color = a_color;\n\n  gl_Position = pos;\n}\n", | ||||
|         "frag": "\nprecision highp float;\n\n#if USE_ALPHA_TEST\n  \n  uniform ALPHA_TEST {\n    float alphaThreshold;\n  }\n#endif\n\nvoid ALPHA_TEST (in vec4 color) {\n  #if USE_ALPHA_TEST\n      if (color.a < alphaThreshold) discard;\n  #endif\n}\n\nvoid ALPHA_TEST (in float alpha) {\n  #if USE_ALPHA_TEST\n      if (alpha < alphaThreshold) discard;\n  #endif\n}\n\nin vec4 v_color;\n\n#if USE_TEXTURE\nin vec2 v_uv0;\nuniform sampler2D texture;\n#endif\n\n#if SHOW_INNER_GLOW\n\nuniform glow {\n\n  vec4 glowColor;\n\n  float glowColorSize;\n\n  float glowThreshold;\n\n};\n\n/**\n * 获取指定角度方向,距离为xxx的像素的透明度\n *\n * @param angle 角度 [0.0, 360.0]\n * @param dist 距离 [0.0, 1.0]\n *\n * @return alpha [0.0, 1.0]\n */\nfloat getColorAlpha(float angle, float dist) {\n\n  float radian = angle * 0.01745329252;\n\n  vec4 color = texture(texture, v_uv0 + vec2(dist * cos(radian), dist * sin(radian))); \n  return color.a;\n}\n\n/**\n * 获取指定距离的周边像素的透明度平均值\n *\n * @param dist 距离 [0.0, 1.0]\n *\n * @return average alpha [0.0, 1.0]\n */\nfloat getAverageAlpha(float dist) {\n\n  float totalAlpha = 0.0;\n\n  totalAlpha += getColorAlpha(0.0, dist);\n  totalAlpha += getColorAlpha(30.0, dist);\n  totalAlpha += getColorAlpha(60.0, dist);\n  totalAlpha += getColorAlpha(90.0, dist);\n  totalAlpha += getColorAlpha(120.0, dist);\n  totalAlpha += getColorAlpha(150.0, dist);\n  totalAlpha += getColorAlpha(180.0, dist);\n  totalAlpha += getColorAlpha(210.0, dist);\n  totalAlpha += getColorAlpha(240.0, dist);\n  totalAlpha += getColorAlpha(270.0, dist);\n  totalAlpha += getColorAlpha(300.0, dist);\n  totalAlpha += getColorAlpha(330.0, dist);\n  return totalAlpha * 0.0833;\n\n}\n\n/**\n * 获取发光的透明度\n */\nfloat getGlowAlpha() {\n\n  if (glowColorSize == 0.0) {\n    return 0.0;\n  }\n\n  vec4 srcColor = texture(texture, v_uv0);\n  if (srcColor.a <= glowThreshold) {\n    return srcColor.a;\n  }\n\n  float totalAlpha = 0.0;\n  totalAlpha += getAverageAlpha(glowColorSize * 0.1);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.2);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.3);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.4);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.5);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.6);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.7);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.8);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.9);\n  totalAlpha += getAverageAlpha(glowColorSize * 1.0);\n  return totalAlpha * 0.1;\n}\n\n#endif\n\nvoid main () {\n  vec4 o = vec4(1, 1, 1, 1);\n\n  #if USE_TEXTURE\n  o *= texture(texture, v_uv0);\n    #if CC_USE_ALPHA_ATLAS_TEXTURE\n    o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;\n    #endif\n  #endif\n\n  o *= v_color;\n\n  ALPHA_TEST(o);\n\n  gl_FragColor = o;\n\n  #if SHOW_INNER_GLOW\n\n    vec4 color_dest = o;\n\n    float alpha = getGlowAlpha();\n\n    if (alpha > glowThreshold) {\n\n      alpha = 1.0 - alpha;\n\n      alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0;\n    }\n\n    vec4 color_src = glowColor * alpha;\n\n    gl_FragColor = color_src * color_src.a + color_dest;\n  #endif\n}\n" | ||||
|         "frag": "\nprecision highp float;\n\n#if USE_ALPHA_TEST\n  \n  uniform ALPHA_TEST {\n    float alphaThreshold;\n  }\n#endif\n\nvoid ALPHA_TEST (in vec4 color) {\n  #if USE_ALPHA_TEST\n      if (color.a < alphaThreshold) discard;\n  #endif\n}\n\nvoid ALPHA_TEST (in float alpha) {\n  #if USE_ALPHA_TEST\n      if (alpha < alphaThreshold) discard;\n  #endif\n}\n\nin vec4 v_color;\n\n#if USE_TEXTURE\nin vec2 v_uv0;\nuniform sampler2D texture;\n#endif\n\n#if SHOW_OUTTER_GLOW\n\nuniform glow {\n\n  vec4 glowColor;\n\n  float glowColorSize;\n\n  float glowThreshold;\n\n};\n\n/**\n * 获取指定角度方向,距离为xxx的像素的透明度\n *\n * @param angle 角度 [0.0, 360.0]\n * @param dist 距离 [0.0, 1.0]\n *\n * @return alpha [0.0, 1.0]\n */\nfloat getColorAlpha(float angle, float dist) {\n\n  float radian = angle * 0.01745329252;\n\n  vec4 color = texture(texture, v_uv0 + vec2(dist * cos(radian), dist * sin(radian))); \n  return color.a;\n}\n\n/**\n * 获取指定距离的周边像素的透明度平均值\n *\n * @param dist 距离 [0.0, 1.0]\n *\n * @return average alpha [0.0, 1.0]\n */\nfloat getAverageAlpha(float dist) {\n  float totalAlpha = 0.0;\n\n  totalAlpha += getColorAlpha(0.0, dist);\n  totalAlpha += getColorAlpha(30.0, dist);\n  totalAlpha += getColorAlpha(60.0, dist);\n  totalAlpha += getColorAlpha(90.0, dist);\n  totalAlpha += getColorAlpha(120.0, dist);\n  totalAlpha += getColorAlpha(150.0, dist);\n  totalAlpha += getColorAlpha(180.0, dist);\n  totalAlpha += getColorAlpha(210.0, dist);\n  totalAlpha += getColorAlpha(240.0, dist);\n  totalAlpha += getColorAlpha(270.0, dist);\n  totalAlpha += getColorAlpha(300.0, dist);\n  totalAlpha += getColorAlpha(330.0, dist);\n  return totalAlpha * 0.0833;\n\n}\n\n/**\n * 获取发光的透明度\n */\nfloat getGlowAlpha() {\n\n  if (glowColorSize == 0.0) {\n    return 0.0;\n  }\n\n  float totalAlpha = 0.0;\n  totalAlpha += getAverageAlpha(glowColorSize * 0.1);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.2);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.3);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.4);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.5);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.6);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.7);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.8);\n  totalAlpha += getAverageAlpha(glowColorSize * 0.9);\n  totalAlpha += getAverageAlpha(glowColorSize * 1.0);\n  return totalAlpha * 0.1;\n}\n\n#endif\n\nvoid main () {\n  vec4 o = vec4(1, 1, 1, 1);\n\n  #if USE_TEXTURE\n  o *= texture(texture, v_uv0);\n    #if CC_USE_ALPHA_ATLAS_TEXTURE\n    o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;\n    #endif\n  #endif\n\n  o *= v_color;\n\n  ALPHA_TEST(o);\n\n  gl_FragColor = o;\n\n  #if SHOW_OUTTER_GLOW\n\n    float alpha = getGlowAlpha();\n\n    alpha = -1.0 * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) * (alpha - 1.0) + 1.0;\n\n    vec4 color_dest = glowColor * alpha;\n    vec4 color_src = o;\n\n    gl_FragColor = color_src * color_src.a + color_dest * (1.0 - color_src.a);\n  #endif\n}\n" | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|   "_defines": { | ||||
|     "USE_TEXTURE": true, | ||||
|     "USE_ALPHA_TEST": false, | ||||
|     "SHOW_INNER_GLOW": true | ||||
|     "SHOW_OUTTER_GLOW": true | ||||
|   }, | ||||
|   "_props": { | ||||
|     "texture": null, | ||||
| @@ -21,6 +21,6 @@ | ||||
|       "a": 255 | ||||
|     }, | ||||
|     "glowColorSize": 0.2, | ||||
|     "glowThreshold": 0.1 | ||||
|     "glowThreshold": 1 | ||||
|   } | ||||
| } | ||||
| @@ -4745,7 +4745,7 @@ | ||||
|       "__type__": "TypedArray", | ||||
|       "ctor": "Float64Array", | ||||
|       "array": [ | ||||
|         23.039999999999992, | ||||
|         115.20000000000002, | ||||
|         0, | ||||
|         0, | ||||
|         0, | ||||
| @@ -4924,7 +4924,7 @@ | ||||
|     "_N$handle": { | ||||
|       "__id__": 105 | ||||
|     }, | ||||
|     "_N$progress": 0.1, | ||||
|     "_N$progress": 0.5, | ||||
|     "_id": "eaB07N7+FEiIyvpYG+V4DM" | ||||
|   }, | ||||
|   { | ||||
| @@ -5184,7 +5184,7 @@ | ||||
|     "_contentSize": { | ||||
|       "__type__": "cc.Size", | ||||
|       "width": 384, | ||||
|       "height": 459.33 | ||||
|       "height": 567.3299999999999 | ||||
|     }, | ||||
|     "_anchorPoint": { | ||||
|       "__type__": "cc.Vec2", | ||||
| @@ -5196,7 +5196,7 @@ | ||||
|       "ctor": "Float64Array", | ||||
|       "array": [ | ||||
|         288, | ||||
|         229.665, | ||||
|         283.66499999999996, | ||||
|         0, | ||||
|         0, | ||||
|         0, | ||||
| @@ -5228,7 +5228,7 @@ | ||||
|       "__id__": 114 | ||||
|     }, | ||||
|     "_children": [], | ||||
|     "_active": false, | ||||
|     "_active": true, | ||||
|     "_components": [ | ||||
|       { | ||||
|         "__id__": 116 | ||||
| @@ -5385,7 +5385,7 @@ | ||||
|       "ctor": "Float64Array", | ||||
|       "array": [ | ||||
|         0, | ||||
|         -135, | ||||
|         -243, | ||||
|         0, | ||||
|         0, | ||||
|         0, | ||||
| @@ -5509,7 +5509,7 @@ | ||||
|       "ctor": "Float64Array", | ||||
|       "array": [ | ||||
|         0, | ||||
|         -348, | ||||
|         -456, | ||||
|         0, | ||||
|         0, | ||||
|         0, | ||||
| @@ -5846,7 +5846,7 @@ | ||||
|       "ctor": "Float64Array", | ||||
|       "array": [ | ||||
|         0, | ||||
|         -442.665, | ||||
|         -550.665, | ||||
|         0, | ||||
|         0, | ||||
|         0, | ||||
| @@ -5940,7 +5940,7 @@ | ||||
|     "_layoutSize": { | ||||
|       "__type__": "cc.Size", | ||||
|       "width": 384, | ||||
|       "height": 459.33 | ||||
|       "height": 567.3299999999999 | ||||
|     }, | ||||
|     "_resize": 1, | ||||
|     "_N$layoutType": 2, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user