Hi!
Friends.
I want to implement glow shader for 2d image program.
However it is not correct behaviour glow radius and strength are passed via uniform variable.
It is correct behaviour if not use uniform variable.(expected image)
I need to impl same implementation via uniform variable.
please tell me information.
// glow sample
// https://discuss.cocos2d-x.org/t/how-to-make-a-glow-or-outline-effect/32554/6
%{
techniques: [
{
passes: [
{
vert: vs
frag: fs:before
cullMode: none
blend: true
},
{
vert: vs
frag: fs:after
cullMode: none
blend: true
}
]
layer: 0
}
]
properties: {
texture: {
type: sampler2D
value: null
}
alphaThreshold: {
type: number
value: 0.5
}
widthStep: {
type: number
value: 0.0
}
heightStep: {
type: number
value: 0.0
}
strength: {
type: number
value: 0.0
}
blurPixelLength: {
type: number,
value: 8.0
}
blurRadius: {
type: number,
value: 5.5
}
}
%}
%% vs {
precision highp float;
uniform mat4 cc_matViewProj;
#if _USE_MODEL
uniform mat4 cc_matWorld;
#endif
attribute vec3 a_position;
attribute lowp vec4 a_color;
#if USE_TEXTURE
attribute mediump vec2 a_uv0;
varying mediump vec2 v_uv0;
#endif
varying lowp vec4 v_color;
void main () {
mat4 mvp;
#if _USE_MODEL
mvp = cc_matViewProj * cc_matWorld;
#else
mvp = cc_matViewProj;
#endif
#if USE_TEXTURE
v_uv0 = a_uv0;
#endif
v_color = a_color;
gl_Position = mvp * vec4(a_position, 1);
}
}
%% fs {
precision highp float;
#if USE_TEXTURE
uniform sampler2D texture;
varying mediump vec2 v_uv0;
#endif
#include <alpha-test>
varying lowp vec4 v_color;
uniform highp float alphaThreshold;
uniform highp float widthStep;
uniform highp float heightStep;
uniform highp float strength;
uniform highp float blurPixelLength;
uniform highp float blurRadius;
// // // for Sprite
// const float blurRadius = 5.5;
// const float blurPixelLength = 8.0;
vec4 before () {
float blurPixels = (blurRadius * 2.0 + 8.0) * (blurRadius * 2.0 + 8.0);
vec4 color = v_color;
#if USE_TEXTURE
color *= texture2D(texture, v_uv0);
#if _USE_ETC1_TEXTURE
color.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
#endif
#endif
vec4 texColor = texture2D(texture, v_uv0);
float outlineAlpha = 0.0;
float fy = -blurRadius;
float fx = -blurRadius;
for(highp float i = 0.0; i < 1.0; i += 0.0) {
if(fy >= blurRadius){
break;
}
for(highp float j = 0.0; j < 1.0; j += 0.0){
if(fx >= blurRadius) {
break;
}
vec2 coord = vec2(fx * widthStep, fy * heightStep);
vec4 sample = texture2D(texture, v_uv0 + coord);
outlineAlpha += sample.a;
fx+=1.0;
}
fy+=1.0;
}
// for(float fy = -blurRadius; fy <= blurRadius; fy+=1.0) {
// for(float fx = -blurRadius; fx <= blurRadius; fx+=1.0) {
// vec2 coord = vec2(fx * widthStep, fy * heightStep);
// vec4 sample = texture2D(texture, v_uv0 + coord);
// outlineAlpha += sample.a;
// }
// }
outlineAlpha = 1.0 - pow(1.0 - outlineAlpha * 2.0 / blurPixels, strength);
outlineAlpha = clamp(outlineAlpha, 0.0, 1.0);
vec4 outlineColor = vec4(1.0, 0.0, 0.0, 1.0);
vec4 res = mix(texColor, outlineColor, outlineAlpha);
// ALPHA_TEST(res);
radius = blurRadius;
_length = blurPixelLength;
return res;
}
vec4 after() {
return texture2D(texture, v_uv0);
}
}
actual
expected