19,468
社区成员
发帖
与我相关
我的任务
分享
out vec2 UV;
out vec4 color;
//获取相机坐标系中的坐标
vec4 GetLocalCoord(vec3 position)
{
vec4 view_coord = view_matrix * particle_model_matrix * vec4(position, 1);
return view_coord;
}
//DrawRectangle根据当前输入的点的坐标计算矩形的四个顶点坐标以及uv
void DrawRectangle(vec3 center_position, float size, float ratio)
{
color = particle[0].color;
color.a = particle[0].opacity;
float width_half_size = size / 2;
float height_half_size = width_half_size / ratio;
vec4 local_coord = GetLocalCoord(center_position);
local_coord.x = local_coord.x / local_coord.a;
local_coord.y = local_coord.y / local_coord.a;
local_coord.z = local_coord.z / local_coord.a;
local_coord.a = 0;
vec4 top_left = vec4(-width_half_size, height_half_size, 0.0, 1.0);
vec4 top_right = vec4(width_half_size, height_half_size, 0.0, 1.0);
vec4 bottom_left = vec4(-width_half_size, -height_half_size, 0.0, 1.0);
vec4 bottom_right = vec4(width_half_size, -height_half_size, 0.0, 1.0);
vec4 top_left_rotate = particle[0].rotation_matrix * top_left;
vec4 top_right_rotate = particle[0].rotation_matrix * top_right;
vec4 bottom_left_rotate = particle[0].rotation_matrix * bottom_left;
vec4 bottom_right_rotate = particle[0].rotation_matrix * bottom_right;
top_left_rotate = vec4(top_left_rotate.x / top_left_rotate.a, top_left_rotate.y / top_left_rotate.a, 0.0, 1.0) + local_coord;
top_right_rotate = vec4(top_right_rotate.x / top_right_rotate.a, top_right_rotate.y / top_right_rotate.a, 0.0, 1.0) + local_coord;
bottom_left_rotate = vec4(bottom_left_rotate.x / bottom_left_rotate.a, bottom_left_rotate.y / bottom_left_rotate.a, 0.0, 1.0) + local_coord;
bottom_right_rotate = vec4(bottom_right_rotate.x / bottom_right_rotate.a, bottom_right_rotate.y / bottom_right_rotate.a, 0.0, 1.0) + local_coord;
vec4 top_left_screen = projection_matrix * top_left_rotate;
vec4 top_right_screen = projection_matrix * top_right_rotate;
vec4 bottom_left_screen = projection_matrix * bottom_left_rotate;
vec4 bottom_right_screen = projection_matrix * bottom_right_rotate;
UV = vec2(0.0, 1.0);
gl_Position = top_left_screen;
EmitVertex();
UV = vec2(1.0, 1.0);
gl_Position = top_right_screen;
EmitVertex();
UV = vec2(0, 0);
gl_Position = bottom_left_screen;
EmitVertex();
UV = vec2(1.0, 0);
gl_Position = bottom_right_screen;
EmitVertex();
EndPrimitive();
}
uniform sampler2D framebuffer_sampler;
uniform sampler2D particle_texture;
uniform int blend_mode;
uniform bool is_use_texture = false;
uniform vec2 resolution = vec2(720, 1080);
in vec2 UV;
in vec4 color;
out vec4 Frag_Color;
void DoBlend()
{
float src_luma = Frag_Color.r * Frag_Color.a;
float src_alpha = Frag_Color.a;
vec2 p = gl_FragCoord.xy / resolution.xy;
vec4 frame_buffer_color = texture(framebuffer_sampler, p);
vec4 src_cor = Frag_Color; //top color
vec4 dst_cor = frame_buffer_color; //base color
vec3 blend_color = vec3(0.0);
float result_alpha = src_cor.a + (1 - src_cor.a)*dst_cor.a;
switch (blend_mode)
{
case 0:
blend_color = src_cor.rgb;
break;
case 1:
blend_color = src_cor.rgb + dst_cor.rgb;
break;
case 19:
blend_color = max(src_cor.rgb, dst_cor.rgb);
break;
case 30:
blend_color = src_cor.rgb + dst_cor.rgb - (src_cor.rgb * dst_cor.rgb);
break;
default:
blend_color = src_cor.rgb;
break;
}
if (result_alpha != 0)
Frag_Color.rgb = (1 - src_cor.a/result_alpha)*dst_cor.rgb + (src_cor.a/result_alpha)*((1 - dst_cor.a)*src_cor.rgb + dst_cor.a * blend_color);
else
Frag_Color.rgb = blend_color;
Frag_Color.a = result_alpha;
}
void main()
{
Frag_Color = texture(particle_texture, UV);
Frag_Color.a = color.a * Frag_Color.a;
DoBlend();
}