shader_type canvas_item; uniform vec2 scale = vec2(1,1); uniform vec2 flip_pos = vec2(-1.,-1.); vec2 Line2point(vec2 linePoint,vec2 lineDire,vec2 point) { lineDire = normalize(lineDire); vec2 line2Ori = - linePoint - dot(-linePoint,lineDire)*lineDire; vec2 p2Ori = - point - dot(-point,lineDire)*lineDire; return line2Ori-p2Ori; } vec4 ColorWithA(vec4 oldCol,vec4 newCol){ vec4 finalCol; if((newCol.a + oldCol.a)>=1.) { finalCol.rgb = newCol.rgb ; finalCol.a =1.0; } else{ finalCol.rgb = newCol.a/(newCol.a + oldCol.a)*newCol.rgb + oldCol.a/(newCol.a + oldCol.a)*oldCol.rgb; finalCol.a = oldCol.a +newCol.a; } return finalCol; } void fragment() { vec2 uv = UV; // vec2 mouse_uv = flip_pos ; vec4 finalColor = vec4(0.0); // Initialize with transparent color //拉伸变形校正 float scale_min = scale.x/scale.y; vec2 uv_max = vec2(scale_min,1.); float trueScale; if(scale.y-0.0001) { vec2 left_bottom = vec2(0.,uv_max.y/TEXTURE_PIXEL_SIZE.y * trueScale); vec2 midpoint = (flip_pos - left_bottom)/2. + left_bottom; // vec2 midDirect = vec2(-1.,-1.)/1.414; vec2 midDirect = normalize(vec2(-(flip_pos-left_bottom).y,(flip_pos-left_bottom).x)); //bg //pageback vec2 sharpPoint = vec2(0.,midpoint.y - midDirect.y/midDirect.x * midpoint.x); vec2 flipEdgeDire = normalize(sharpPoint - flip_pos); //pagebackBottom vec2 sharpPointB = vec2(midpoint.x-midDirect.x/midDirect.y * (midpoint-left_bottom).y,left_bottom.y); vec2 flipEdgeDireB = normalize(sharpPointB - flip_pos); //圆柱 float cyOriOff = length(flip_pos-left_bottom); if (cyOriOff>100.) cyOriOff = 100.;//圆柱向里面缩进 float cyR = cyOriOff*2./PI; float pageHDire = PI/6.; vec2 midlineToP = Line2point(midpoint,midDirect,pPos); vec2 sideEdgeToP = Line2point(flip_pos,flipEdgeDire,pPos); vec2 BottomEdgeToP = Line2point(flip_pos,flipEdgeDireB,pPos); vec2 cyOriToP = midlineToP - normalize(flip_pos- left_bottom)*cyOriOff; vec2 cyEdgeToP = midlineToP - normalize(flip_pos- left_bottom)*(cyOriOff-cyR); bool atBG = (cyOriToP).x<=-0.01; bool atPageBack = !atBG&&(sideEdgeToP.y>0.)&&(BottomEdgeToP.x<=0.); // bool atCy = (cyOriToP).x<=0.; bool atCy = cyEdgeToP.x >=0. && (cyOriToP).x<=0.; bool atCyPage = false; vec2 uvCy ; vec2 uvCyB ; float shadow = 1.; if (atCy){ vec2 cyOri = pPos-cyOriToP; vec2 trueDis = cyR* asin(length(cyOriToP)/cyR)*normalize(cyOriToP); vec2 truePos = cyOri+trueDis; vec2 sideEdgeToTP = Line2point(flip_pos,flipEdgeDire,truePos); vec2 BottomEdgeToTP = Line2point(flip_pos,flipEdgeDireB,truePos); uvCyB = truePos * TEXTURE_PIXEL_SIZE /trueScale; shadow *= 1.-pow(length(trueDis)/(cyR*PI/2.),3.); if ((BottomEdgeToTP.x<0.)&& (sideEdgeToTP.y>0.)) { atCyPage = true; uvCy = vec2(length(sideEdgeToTP),left_bottom.y-length(BottomEdgeToTP))*TEXTURE_PIXEL_SIZE /trueScale; } if ((uvCyB.x > uv_max.x)||(uvCyB.y > uv_max.y)||(uvCyB.x <= 0.)|| (uvCyB.y <= 0.)) atCy =false; } //色彩 COLOR = vec4(0.); // Page if (!atBG && !atCy) { vec4 color = texture(TEXTURE, uv); finalColor = color; } // cyBottom if (atCy) { vec4 cyColor = texture(TEXTURE, uvCyB); finalColor = cyColor; } if (atCyPage) { vec4 cyPageColor = texture(TEXTURE, uvCy); cyPageColor.xyz *= 0.8; // Blend based on the alpha value of cyPageColor finalColor = mix(finalColor, cyPageColor, cyPageColor.a); } else if (atPageBack) { uv = vec2(length(sideEdgeToP), left_bottom.y - length(BottomEdgeToP)) * TEXTURE_PIXEL_SIZE / trueScale; vec4 pageBackColor = texture(TEXTURE, uv); pageBackColor.xyz *= 0.8; // Blend based on the alpha value of pageBackColor finalColor = mix(finalColor, pageBackColor, pageBackColor.a); } COLOR = finalColor; } // Place fragment code here. // FRAGCOORD.xy; }