From 0318224673c3e81d78dab73673e13438a38434fd Mon Sep 17 00:00:00 2001 From: Xiang Silian Date: Mon, 22 Sep 2025 21:08:13 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=BB=E5=87=BA=E8=99=9A=E7=BA=BF=E6=9D=A5?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/texture_loading/glsl/point_line.frag | 81 +++++++----------- .../texture_loading/glsl/point_line.frag.spv | Bin 3872 -> 2844 bytes 2 files changed, 31 insertions(+), 50 deletions(-) diff --git a/shaders/texture_loading/glsl/point_line.frag b/shaders/texture_loading/glsl/point_line.frag index cc437e2..2104ed2 100644 --- a/shaders/texture_loading/glsl/point_line.frag +++ b/shaders/texture_loading/glsl/point_line.frag @@ -1,67 +1,48 @@ #version 450 layout(location = 0) in vec3 fragColor; -layout(location = 1) in vec3 fragSegmentStart; -layout(location = 2) in vec3 fragSegmentEnd; -//layout(location = 3) in vec3 fragWorldPos; +layout(location = 1) in vec3 fragLineStart; +layout(location = 2) in vec3 fragLineEnd; layout(location = 0) out vec4 outColor; -layout(binding = 0) uniform UniformBufferObject { - mat4 proj; - mat4 model; - mat4 view; -} ubo; - -layout(binding = 1) uniform DashParameters { - float dashSize; - float gapSize; - float dashOffset; - float uAASize; - int useWorldSpace; -} dashParams; - void main() { - // 转换为NDC坐标 - vec3 ndcStart = fragSegmentStart / fragSegmentStart.z; - vec3 ndcEnd = fragSegmentEnd / fragSegmentEnd.z; - vec3 fragNDC = gl_FragCoord.xyz / gl_FragCoord.z; - fragNDC = (fragNDC * 2.0) - 1.0; - - // 计算当前片元在线段上的投影 - vec2 lineDir = normalize(ndcEnd.xy - ndcStart.xy); - vec2 startToFrag = fragNDC.xy - ndcStart.xy; - float projection = dot(startToFrag, lineDir); + vec2 fragPos = gl_FragCoord.xy; - // 计算线段在屏幕空间的长度(用于抗锯齿) - float segmentLength = length(ndcEnd.xy - ndcStart.xy); + vec2 start = (fragLineStart.xy * 0.5 + 0.5) * 480.0; + vec2 end = (fragLineEnd.xy * 0.5 + 0.5) * 480.0; - // 应用虚线模式 - float dashPeriod = dashParams.dashSize + dashParams.gapSize; - float currentPos = mod(projection + dashParams.dashOffset, dashPeriod); + vec2 lineDir = end - start; + float lineLength = length(lineDir); - // 抗锯齿处理 - float alpha = 1.0; + if (lineLength < 1.0) { + outColor = vec4(fragColor, 1.0); + return; + } - // 线段开始处的抗锯齿(避免线段起始处出现半截虚线) - alpha *= smoothstep(0.0, dashParams.uAASize / segmentLength, projection); + lineDir = normalize(lineDir); + vec2 toFrag = fragPos - start; + float projection = dot(toFrag, lineDir); + projection = clamp(projection, 0.0, lineLength); - // 线段结束处的抗锯齿 - alpha *= 1.0 - smoothstep(segmentLength - dashParams.uAASize / segmentLength, - segmentLength, projection); + vec2 closestPoint = start + lineDir * projection; + float distanceToLine = length(fragPos - closestPoint); - // 虚线模式抗锯齿 - alpha *= 1.0 - smoothstep(dashParams.dashSize, - dashParams.dashSize + dashParams.uAASize / dashPeriod, - currentPos); + float lineWidth = 6.0; - // 如果alpha接近0,直接丢弃片元 + if (distanceToLine > lineWidth) { + discard; + } - // if (alpha < 0.01) { - // discard; - // } + float dashLength = 50.0; + float gapLength = 20.0; - // outColor = vec4(fragColor, alpha); - - outColor = vec4(1, 0, 0, 1.0); + float patternLength = dashLength + gapLength; + float patternPos = mod(projection, patternLength); + + if (patternPos > dashLength) { + discard; + } + + outColor = vec4(fragColor, 1.0); } \ No newline at end of file diff --git a/shaders/texture_loading/glsl/point_line.frag.spv b/shaders/texture_loading/glsl/point_line.frag.spv index 29e4b7a1d3aeb90f9e94858020e7b11cdc48543c..c2b932b2d7ad8871b5b6ab0a9f53556f3d46422a 100644 GIT binary patch literal 2844 zcmZ9NTW?cG6oscr9B$!OZY^yg5L&KHq2;D>i6I1s))3Qh6%gat2j?Jjj%yz(^{rK( z=~I79#S`Ke^$mntsq33FJB&Ee*6g+RnwdR&_SmB%Q)`_2$Zc>N-OsN4wz?59PTaU3 zYxTwY^swkmpFDLO#U?lEg=jXr^=?cf_NW&8wnj^L)?|6hEdjI5#X>gTmu+pF8vF%3*PpA9bH8o@5=(sra** zX3leCZc1_TzLE~S=1{=(B{apg$e$Opc`qL*>^bVgT1Jx7d2vNfs->nX+#lpm zsYk9VbDnu|?Or}ihD9S!Gt&3`4UL^tC(7E%t(;SoYb=Tc-12*#GP{~`r_LK>)D=uG?2*wgVEO_~4}j?rFdvwD7~Uoo zx_!QD$~imbkBgg>?UJ6J0;8K0UaJufBfefEar%QexseO}xq!(T4*eF5=;?CwTQw4c zM-S#qa7TsF?vUx5G5o2A|IC`6Goxp{gBmSo(;xHt-)6S!6kiA33611nd4j1GoUKc( z;ymVr`E1==9=)m>e(3T1<P1cXSo5uzibmF^hP)s0G|YX*nD-FlsR$pGe<;GN zM^Brccs0Vr=Oavh1g;Q6TQMOB76 z5Mv%auuaDO+q~_8gXd%3pQh1u}>UYVwT5#`S6wp_YOxMobiAR&hVG=$@PzLwy)%) zf#)3b37qK<%ZHoLOX4jZk&*jl88PP2OYqD=b5sWRxAx$@Ob3p4^hSFBMyOJyK>yj{>&8N=f@K>n8 ztb8=^>|fOghn^Z;kyRsnRX%qypl{1)-s zYI)w4Pu%bw`Dk8-{=6$64LtpMUn3v=N$j2sj{d;^H}nb|`|(@%F!+yxZ+kU`i5q?_ z9}V^4K3Xy~k7ca2q!G^aZTZy*cjTja5#}fI(ZDl*StFdyevvN{6vYRUv=z!r-8upuFarg4jj~_J zQ3GRHIjyf@9QEvugClNMW^wEt#^LXdgClNB#u>Pu2^quu$${&R>X!ulMEa}ZQhZ!^ zNZh#WgyPAMpOKBrr{{1O{yxonyg%c8?ilWv`~#ZDWsK9_KPb$;#Pb%=vWLa^5XG}`o zDQlq(G+FnNc=Dp5HhkU~9JQdkCS$NyK{IRQvh|`cXE%RU*y7RMmN9JoYhk;aEsw1? z_}iX4quSvg%IF7qFtGJ~N0_}&sqo?m<{(ZxlQU7o9sf{;H4*bWSyPz1>h-Xma z-(q;bXh$^jA2S^I{D*`-{}twQPy8o@KK}{kb8q|~gg*ZTp}(}t=l3;S=eHIAlImmT zw}iJmr>c3UeAoEAUo_mu5gGi7JYt^q96a_!vG7M_!kxm|xnB{6`@{F?RbjYOGRytCFz?iC$7|mZhn{uI4QIKhg*kgs zr{w#7O9qEAIHzgP3Ueo>eOnj~W1wYU^1LG>7n)JsJKVc6G>bCUsfYIpZ+n~<=B&2I z1z|Xh5!Umb{IH&j^5HN>SkL?N$%Te}`7Yqtm)bs*!I^(anA-l-d3eK@WoY1upYfd4 zJu5%#!H0W8U9=>CE-Xp)6pUC)Ky(XhZ z;;zf!O|v45hTl`ud@2mT?a%$0Fmdqgv!of$^f!d*h2{KQn4GIJ)7%t>x13)H69;da zFNMkdyWjUKVRZ29Tha^%zNMLWZhL+s%%1$tTfVX|y!m&8=@H)?y{O30+>x1PO_;Nc z>YGPXmCM`<;9^w02%NJ6|Hq`NB8Y zl@D*4-v4O&;^0lQ={4c~-V+CJwS6zVB(wXyFN_9$+xO{#Fu7T?xF3XhTXyF^3R_>O ml^8VEm!E{`3p&g3vvAm#U*yA~wZ6cCw>3YM{i9tj%KinBpD#QB