CocosCreator-Shader-Effect-.../assets/effects/sprite-flash-light.effect
2020-01-13 15:27:46 +08:00

193 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
// 闪光(光速扫过)
// 原理(和点光的很类似):
// 1. 画光束
// 2. 圆心中间高亮(透明度=1.0),边缘不亮(透明度=0.0
// 3. 在原图像上方叠加光束
CCEffect %{
techniques:
- passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: none
properties:
texture: { value: white }
alphaThreshold: { value: 0.5 }
# 光束颜色
lightColor: {
value: [1.0, 1.0, 0.0, 1.0],
inspector: {
type: color,
tooltip: "光束颜色"
}
}
# 光束中心点坐标
lightCenterPoint: {
value: [0.2, 0.2],
inspector: {
tooltip: "光束中心点坐标"
}
}
# 光束倾斜角度
lightAngle: {
valu: 45.0,
inspctor: {
tooltip: "光束倾斜角度",
range: [0.0, 1.0],
}
}
# 光束宽度
lightWidth: {
value: 0.4,
inspector: {
tooltip: "光束宽度"
}
}
# 启用光束渐变
enablGradient: {
value: 0,
inspecator: {
tooltip: "是否启用光束渐变。0不启用非0启用"
}
}
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>
in vec3 a_position;
in vec4 a_color;
out vec4 v_color;
#if USE_TEXTURE
in vec2 a_uv0;
out vec2 v_uv0;
#endif
void main () {
vec4 pos = vec4(a_position, 1);
#if CC_USE_MODEL
pos = cc_matViewProj * cc_matWorld * pos;
#else
pos = cc_matViewProj * pos;
#endif
#if USE_TEXTURE
v_uv0 = a_uv0;
#endif
v_color = a_color;
gl_Position = pos;
}
}%
CCProgram fs %{
precision highp float;
#include <alpha-test>
in vec4 v_color;
#if USE_TEXTURE
in vec2 v_uv0;
uniform sampler2D texture;
#endif
#if ENABLE_DIFFUSION
uniform Light {
// 光束颜色
vec4 lightColor;
// 光束中心点坐标
vec2 lightCenterPoint;
// 光束倾斜角度
float lightAngle;
// 光束宽度
float lightWidth;
// 启用光束渐变
float enablGradient;
// 裁剪掉透明区域上的点光
// ps编辑器还不支持 bool 类型的样子,因此没在 CCEffect 中定义
bool cropAlpha;
// 是否启用迷雾效果
// ps编辑器还不支持 bool 类型的样子,因此没在 CCEffect 中定义
bool enableFog;
}
// /**
// * 添加光束颜色
// */
// vec4 addLightColor(vec4 textureColor, vec2 lightCenterPoint, float radius, vec4 lightColor) {
// // 计算当前 uv 到 光束 的距离
// float dis = distance(v_uv0, lightCenterPoint);
// float a = 1.0 ;
// // 裁剪掉透明区域上的点光
// if (cropAlpha) {
// a *= step(0.01, textureColor.a);
// }
// // 裁剪掉扩散范围外的uv迷雾效果
// if (!enableFog) {
// a *= step(dis, radius);
// }
// // 加入从中心往外渐变的效果
// a *= 1.0 - (dis / radius);
// // 加点料,让中心点更加亮
// // a = -1.0 * (a - 1.0) * (a - 1.0) + 1.0;
// // a = -1.0 * (a - 1.0) * (a - 1.0) * (a - 1.0) * (a - 1.0) + 1.0;
// // 计算出扩散范围内,不同 uv 对应的实际扩散颜色值
// vec4 diffusionColor = lightColor * a;
// // 混合颜色:在原始图像颜色上叠加扩散颜色
// return textureColor * textureColor.a + diffusionColor;
// }
#endif
void main () {
vec4 o = vec4(1, 1, 1, 1);
#if USE_TEXTURE
o *= texture(texture, v_uv0);
#if CC_USE_ALPHA_ATLAS_TEXTURE
o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
#endif
#endif
o *= v_color;
ALPHA_TEST(o);
gl_FragColor = o;
#if ENABLE_DIFFUSION
// gl_FragColor = addLightColor(gl_FragColor, lightCenterPoint, radius, lightColor);
#endif
}
}%