九宫格渲染着色器

Constructor

@:glFragmentSource("#pragma header\nuniform vec4 u_size;\nuniform vec4 u_s9d;\nuniform vec4 u_frameSpriteRect;\nvec2 getFrameCoodv(){\n\treturn vec2(fract((openfl_TextureSize.x * openfl_TextureCoordv.x - u_frameSpriteRect.x) / u_frameSpriteRect.z), fract((openfl_TextureSize.y * openfl_TextureCoordv.y - u_frameSpriteRect.y) / u_frameSpriteRect.w));\n}\nvec2 getUv(float x, float y){\n\tif(u_size.z == 1.){\n\t\treturn vec2(u_frameSpriteRect.x + x, u_frameSpriteRect.y + y) / openfl_TextureSize;\n\t}\n\treturn vec2(x / openfl_TextureSize.x, y / openfl_TextureSize.y);\n}\nvec4 texture2Dgery(vec2 u){\n\tvec4 color = texture2D(openfl_Texture, u);\n\tfloat colorAdd = (color.r + color.b + color.g) / 3.;\n\tcolor.r = step(u_size.w, 0.5) * color.r + colorAdd * step(0.5, u_size.w);\n\tcolor.g = step(u_size.w, 0.5) * color.g + colorAdd * step(0.5, u_size.w);\n\tcolor.b = step(u_size.w, 0.5) * color.b + colorAdd * step(0.5, u_size.w);\n\treturn color;\n}\nvoid main(void){\n\t#pragma body\n\tvec2 uv = (u_size.z == 1.) ? getFrameCoodv() * u_size.xy : openfl_TextureCoordv * u_size.xy;\n\tfloat centerWidth = u_size.x - u_s9d.x - u_s9d.y;\n\tfloat centerHeight = u_size.y - u_s9d.z - u_s9d.w;\n\tfloat centerSliceWidth = ((u_size.z == 1.) ? u_frameSpriteRect.z : openfl_TextureSize.x) - u_s9d.x - u_s9d.y;\n\tfloat centerSliceHeight = ((u_size.z == 1.) ? u_frameSpriteRect.w : openfl_TextureSize.y) - u_s9d.z - u_s9d.w;\n\tvec4 color2 = vec4(0.);\n\tif(uv.x <= u_s9d.x && uv.y <= u_s9d.z){\n\t\tcolor2 = texture2Dgery(getUv(uv.x, uv.y));\n\t}else {\n\t\tif(uv.x >= u_size.x - u_s9d.y && uv.y <= u_s9d.z){\n\t\t\tcolor2 = texture2Dgery(getUv(u_s9d.x + centerSliceWidth + uv.x - (u_size.x - u_s9d.y), uv.y));\n\t\t}else {\n\t\t\tif(uv.x <= u_s9d.x && uv.y >= u_size.y - u_s9d.w){\n\t\t\t\tcolor2 = texture2Dgery(getUv(uv.x, centerSliceHeight + u_s9d.z + uv.y - (u_size.y - u_s9d.w)));\n\t\t\t}else {\n\t\t\t\tif(uv.x >= u_size.x - u_s9d.y && uv.y >= u_size.y - u_s9d.w){\n\t\t\t\t\tcolor2 = texture2Dgery(getUv(u_s9d.x + centerSliceWidth + uv.x - (u_size.x - u_s9d.y), centerSliceHeight + u_s9d.z + uv.y - (u_size.y - u_s9d.w)));\n\t\t\t\t}else {\n\t\t\t\t\tif(uv.y <= u_s9d.z){\n\t\t\t\t\t\tcolor2 = texture2Dgery(getUv(u_s9d.x + (uv.x - u_s9d.x) / centerWidth * centerSliceWidth, uv.y));\n\t\t\t\t\t}else {\n\t\t\t\t\t\tif(uv.y >= u_size.y - u_s9d.w){\n\t\t\t\t\t\t\tcolor2 = texture2Dgery(getUv(u_s9d.x + (uv.x - u_s9d.x) / centerWidth * centerSliceWidth, centerSliceHeight + u_s9d.z + uv.y - (u_size.y - u_s9d.w)));\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tif(uv.x <= u_s9d.x){\n\t\t\t\t\t\t\t\tcolor2 = texture2Dgery(getUv(uv.x, u_s9d.z + (uv.y - u_s9d.z) / centerHeight * centerSliceHeight));\n\t\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\t\tif(uv.x >= u_size.x - u_s9d.y){\n\t\t\t\t\t\t\t\t\tcolor2 = texture2Dgery(getUv(centerSliceWidth + u_s9d.x + uv.x - (u_size.x - u_s9d.y), u_s9d.z + (uv.y - u_s9d.z) / centerHeight * centerSliceHeight));\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tcolor2 = texture2Dgery(getUv(u_s9d.x + (uv.x - u_s9d.x) / centerWidth * centerSliceWidth, u_s9d.z + (uv.y - u_s9d.z) / centerHeight * centerSliceHeight));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tgl_FragColor = color2 * openfl_Alphav;\n}")new (left:Float, top:Float, bottom:Float, right:Float, width:Float, height:Float)

Bate 测试内容 override function fragment() {

		super.fragment();
		var uv:Vec2 = size.z == 1 ? getFrameCoodv() * size.xy : gl_openfl_TextureCoordv * size.xy;
		var centerWidth:Float = size.x - s9d.x - s9d.y; // 中间宽度
		var centerHeight:Float = size.y - s9d.z - s9d.w; // 中间高度
		var centerSliceWidth:Float = (size.z == 1 ? frameSpriteRect.z : gl_openfl_TextureSize.x) - s9d.x - s9d.y; // 中间原图宽度
		var centerSliceHeight:Float = (size.z == 1 ? frameSpriteRect.w : gl_openfl_TextureSize.y) - s9d.z - s9d.w; // 中间原图高度
		var color2:Vec4 = vec4(0);

		var uvx:Float = uv.x;
		var uvy:Float = uv.y;
		var s9dx:Float = s9d.x;
		var s9dy:Float = s9d.y;
		var s9dz:Float = s9d.z;
		var s9dw:Float = s9d.w;
		var sizex:Float = size.x;
		var sizey:Float = size.y;

		// 左上
		// if (uv.x <= s9d.x && uv.y <= s9d.z) {
		var if1:Float = step(uvx, s9dx);
		var if2:Float = step(uvy, s9dy);
		color2 += texture2Dgery( getUv(uvx, uvy)) * if1 * if2;
		// 右上
		// } else if (uv.x >= size.x - s9d.y && uv.y <= s9d.z) {
		var if3:Float = step(sizex - s9dy, uvx);
		var if4:Float = step(uvy, s9dz);
		color2 += if3 * if4 * texture2Dgery( getUv(s9dx + centerSliceWidth + uvx - (sizex - s9dy), uvy));
		// 左下
		var if5:Float = step(uvx, s9dx);
		var if6:Float = step(sizey - s9dw, uvy);
		color2 += if5 * if6 * texture2Dgery( getUv(uvx, centerSliceHeight + s9dz + uvy - (sizey - s9dw)));
		// 右下
		var if7:Float = step(sizex - s9dy, uvx);
		var if8:Float = step(sizey - s9dw, uvy);
		color2 += if7 * if8 * texture2Dgery(
			getUv(s9dx + centerSliceWidth + uvx - (sizex - s9dy), centerSliceHeight + s9dz + uvy - (sizey - s9dw)));
		// 上
		var if9:Float = step(uvy , s9dz);
		color2 += if9 * texture2Dgery( getUv(s9dx + (uvx - s9dx) / centerWidth * centerSliceWidth, uvy));
		// 下
		var if10:Float = step(sizey - s9dw, uvy);
		color2 += if10 * texture2Dgery(
			getUv(s9d.x + (uvx - s9dx) / centerWidth * centerSliceWidth, centerSliceHeight + s9dz + uvy - (sizey - s9dw)));
		// 左
		var if11:Float = step(uvx, s9dx);
		color2 += if11 * texture2Dgery( getUv(uvx, s9dz + (uvy - s9dz) / centerHeight * centerSliceHeight));
		// 右
		var if12:Float = step(sizex - s9dy, uvx);
		color2 += if12
			+ texture2Dgery(
				getUv(centerSliceWidth + s9dx + uvx - (sizex - s9dy), s9dz + (uvy - s9dz) / centerHeight * centerSliceHeight));

		if (color.rgb == vec3(0, 0, 0)) {
			// 中间
			color2 = texture2Dgery(
				getUv(s9dx + (uvx - s9dx) / centerWidth * centerSliceWidth, s9dz + (uvy - s9dz) / centerHeight * centerSliceHeight));
		}

		if (size.w == 1) {
			var rgb:Float = (color2.r + color2.g + color2.b) / 3.;
			color2 = vec4(rgb, rgb, rgb, gl_FragColor.a);
		}
		gl_FragColor = color2 * gl_openfl_Alphav;
	}
	#end

Variables

@:uniformframeSpriteRect:Vec4

精灵图的尺寸

@:uniforms9d:Vec4

九宫格数据

@:uniformsize:Vec4

显示对象尺寸

@:keepu_frameSpriteRect:ShaderParameter<Float>

@:keepu_s9d:ShaderParameter<Float>

@:keepu_size:ShaderParameter<Float>

Methods

@:glslgetFrameCoodv ():Vec2

获取精灵图的Uv值

Returns:

Vec2

@:glslgetUv (x:Float, y:Float):Vec2

获取指定位置的UV图

Parameters:

x
y

Returns:

Vec2

@:glsltexture2Dgery (u:Vec2):Vec4

updateArgs (left:Float, top:Float, bottom:Float, right:Float):Void

updateFrame (frame:Frame):Void

updateSize (width:Float, height:Float):Void