From 3207c47dd2164018a3435a375b80b85eacde1553 Mon Sep 17 00:00:00 2001 From: Xiang Silian Date: Mon, 22 Sep 2025 18:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=99=9A=E7=BA=BF=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/texture_loading/glsl/point_line.frag | 60 +++++++++++++++--- .../texture_loading/glsl/point_line.frag.spv | Bin 1176 -> 5068 bytes shaders/texture_loading/glsl/point_line.vert | 19 ++++-- .../texture_loading/glsl/point_line.vert.spv | Bin 1928 -> 2508 bytes 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/shaders/texture_loading/glsl/point_line.frag b/shaders/texture_loading/glsl/point_line.frag index ffb68b9..c51c141 100644 --- a/shaders/texture_loading/glsl/point_line.frag +++ b/shaders/texture_loading/glsl/point_line.frag @@ -1,24 +1,64 @@ #version 450 layout(location = 0) in vec3 fragColor; -layout(location = 1) in float fragLinePosition; +layout(location = 1) in vec3 fragSegmentStart; +layout(location = 2) in vec3 fragSegmentEnd; +layout(location = 3) in vec3 fragWorldPos; 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() { - // 硬编码虚线参数 - const float dashSize = 0.05; - const float gapSize = 0.05; + // 转换为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); - // 使用时间创建动画效果(需要GL_EXT_shader_realtime_clock_speed扩展) - // 或者使用一个简单的基于帧计数的方法 - float time = float(gl_FragCoord.x + gl_FragCoord.y) * 0.01; // 简单的伪时间 + // 计算线段在屏幕空间的长度(用于抗锯齿) + float segmentLength = length(ndcEnd.xy - ndcStart.xy); - float patternPosition = mod(fragLinePosition, dashSize + gapSize); + // 应用虚线模式 + float dashPeriod = dashParams.dashSize + dashParams.gapSize; + float currentPos = mod(projection + dashParams.dashOffset, dashPeriod); - if (patternPosition > dashSize) { + // 抗锯齿处理 + float alpha = 1.0; + + // 线段开始处的抗锯齿(避免线段起始处出现半截虚线) + alpha *= smoothstep(0.0, dashParams.uAASize / segmentLength, projection); + + // 线段结束处的抗锯齿 + alpha *= 1.0 - smoothstep(segmentLength - dashParams.uAASize / segmentLength, + segmentLength, projection); + + // 虚线模式抗锯齿 + alpha *= 1.0 - smoothstep(dashParams.dashSize, + dashParams.dashSize + dashParams.uAASize / dashPeriod, + currentPos); + + // 如果alpha接近0,直接丢弃片元 + if (alpha < 0.01) { discard; } - outColor = vec4(fragColor, 1.0); + outColor = vec4(fragColor, alpha); } \ 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 171c1c9fd5e943065a28be9a65ddb68dc6a3ff00..0b2c07a140953fa1723dff659c58ce8beac7385a 100644 GIT binary patch literal 5068 zcmZ9O`IlTp6~|vP3mC#CVN-~m1ceBO9V1&Z%p?=cKNdT85 zB8m&RApt~177^3~xFW(Y{uBNwdOUiLpU>-eL(z54o%-Hy-K}m_^_!8kTTaQcHQ8y| z>DhbPV4R(;g~{N?%XxZcer8**-`sZH^;c3z14ByG~`^QhP;Wq zg}jZNg`ajL1dWg-%l<)-(QI8dJ+m-9J3BqIYoW2Sve4^4+|C!;txmqsY!!K<-#VOY zcWPqS>NMJ`&D3BFi?oihY%Kc_IXcb8e7|1wfiUA`eTzkXX@>Z*pznr(?XFH!yRmW) zVJE50#n{O0oti9T)zFvP3%j8vyWIlMf$tT}y+)Deok0fUU3ro#QGm(%^Q_4cezOnkuBbF&ZoTFr9LiYk4* z%iY!fWVhWt*+1{L_aR8nz`HKz{fa{zV?Xb}-_vO=c8lfPRu>oZV)meCSN6pLX>3UE4z> z`|a2=m`-xWlJkthP9M2b6K_Xush{-?`$cbdCVu8l{nUs3 zJoZe5ehC~qpSptX8u#OfHu7O}DVVV{^sS|OY==2N4Ynp@yY8NMBau`6cEn*%?q;qb zu5YBHz7KteWned&-OHN$*Umkudza+UVLkUTyB77h{s0p7s2@a9e}5e8VeD@i z%-9j}yC~j)Sbq(??w?z3-awSs!RCFVvWecS`^NN(v-OQxhq`C)8&kgk{cp_rTE|At z!nYz9VvfI~TeoY*Q1_0@-GGm?{tom08^$-It#{Y&wr3UkhD7&n`5lgRb-%Z%e&vwv zcQ)3&2ip@}f4{Hk`b46;zAMr7_j{V!`yEa714Fvsp>*BvP^$Y4O7#9V8S}t;(2lj18uJbEB&2<5s zeB`Av#y6^tUio2}hFJ+#q zxKDz&R`O`YU5>7;Yu4fYk&8Wl3Tz*uj%{E$#bF)#dCy!6zpKFRDg3Sm%PEfV^FF$! zpL@9$kqiAgu(6}w>%rQ{ujf4VxdAbrchPn0@m|YEoX>#MxHqDwac@G`M&7vIo0}2i z-iEktT;GR$#Jv@4&qCh;PUG%G*G67{-_uSc?2RoK`Xt!epW=M1VG7YkUjK=T^A7sn zrV;ITBgW8Y4k&-_xJfN^w_8IwAaR(jxxI*zTXD> zn-cjR2M_1_4xD`S>APV4`AbG@)73;;0Ywo?1$jki+T0Y zCTjT+cq^h^#P~7Tea5-`1T3d*^gu4`p8{(i`cJ{>xjv09r(K+@T=eW2uzTH)M2u&_ z@?rBFc(@-wgOiWFJP+1SKKy;a1dAS5sdMc~Uw3E~HgEPIGXn#@@C1c@6QIP!-$ zat>#H3J8J3``X=+TPju6>sMV>Z>Bcenm3!VC0n+(P0qT_3Nc}G&UfQ?aeG`1+K(PT zgt1~ZM})I#i&mG%j(b_b#ggoT?1t>NY)yRb)kslIubX{Waorl$jg#)dK{tM#^oPS_ zTz$;bB+rU88DyihUu7Rscned!tmx+_gK0t}#&m!31@)-1V^y0)+Jl*n^5o5^ceG!Y zqd~xT6byS+m5z$Ta-3CJS%^RH=6^48tXa-3+*^^`t30Xp%e)*--ih3v@B`S@4D`fS zW#njbO@?md=tIsSN2`!;NF{XIb&8pbw-wI`YdWhtJ<$|wNA-(7MvJEMhCIE%pZT15 zz_yg1lW)p6dp=*Dq^^ENF5luL}@mokFPc8cK zui!(@KSBOVEOz4ip&QzCRKqN5GVs7TuNV&c1kQ$H@XvaOnoSvX;9oqp?QwK`q3M_f zEWB}1F`9n${L6~L&=o$jf(8B+#bDpWN8jr*Fm(SV{;oXdkM`iMDFZ_j;=fXn7>qa3 v_>K&H-})Kuc}(sM+w<7W6n5WZ=zl0h`MwWi)WheV@5CN_Z|?r7|5Mq2RHa`L diff --git a/shaders/texture_loading/glsl/point_line.vert b/shaders/texture_loading/glsl/point_line.vert index 216473c..f5a0665 100644 --- a/shaders/texture_loading/glsl/point_line.vert +++ b/shaders/texture_loading/glsl/point_line.vert @@ -2,9 +2,13 @@ layout(location = 0) in vec3 inPosition; layout(location = 1) in vec3 inColor; +layout(location = 2) in vec3 inLineStart; +layout(location = 3) in vec3 inLineEnd; layout(location = 0) out vec3 fragColor; -layout(location = 1) out float fragLinePosition; // 用于虚线计算 +layout(location = 1) out vec3 fragLineStart; +layout(location = 2) out vec3 fragLineEnd; + layout(binding = 0) uniform UniformBufferObject { mat4 proj; @@ -13,11 +17,12 @@ layout(binding = 0) uniform UniformBufferObject { } ubo; void main() { - mat4 mvp = ubo.proj * ubo.view * ubo.model; - gl_Position = mvp * vec4(inPosition, 1.0); - fragColor = inColor; - gl_PointSize = 2.0; + mat4 worldviewproj = ubo.proj * ubo.view * ubo.model; + gl_Position = worldviewproj * vec4(inPosition, 1.0); - // 硬编码虚线参数:使用模型空间的X坐标,你可以根据需要调整 - fragLinePosition = inPosition.x; + fragColor = inColor; + + // 传递裁剪空间坐标 + fragLineStart = (worldviewproj * vec4(inLineStart, 1.0)).xyz; + fragLineEnd = (worldviewproj * vec4(inLineEnd, 1.0)).xyz; } \ No newline at end of file diff --git a/shaders/texture_loading/glsl/point_line.vert.spv b/shaders/texture_loading/glsl/point_line.vert.spv index dcb8f9b38f2aa5cf0042699ea2df92cf2f94019d..159f60757407b6ef065213b55c9cb6521027e1a2 100644 GIT binary patch delta 846 zcmYk3zfJ-{7{tHhuh9?+L##9^iKQkgiXw<2B1)ph%8~>`i~&Q4l(aS$6jnZk;Q@RB zd!NR{`5kv~cbVIr`DS;%y?smmEGELCbll9b1xwh~D3NiJqtaSx+st-_BcUKvgzBi- zPQ`3q(?PfQ+<0v_2QR(uliAnrmNSeQiynIQR;}G>-u3IfzIaqG8?`$#6^)I3Z@JTO zeFRN>D6EaS!M?B7?6mri6TLe1dg^#N)N<}=VMTC+ibdRLc*x_#204-Nuvh1tK~4-j zGJX$#JHwo|+!Q5-CGfOHPDrF*Cni`YhWe`f=Uy$Q5kH(*{M0Wr;`Qrr+K@K>jD9%7 zyi9Wvb_6a1zOFGN(8#U(iJNYjz;89zXRBVWfRk8`_}= z;h3(~3gI~c9qGq}M+ZE?#<@o7G|qKg3e_cjI2Ct>@TVnN;U7SkP;CGJ delta 260 zcmX>j+`-Sw%%sfDz`)4B&A`iGHIdhpk!zx}BBSZV%1lmX1}+8$hTO7(jo54 zfxNV$#B`s`ywrgF;>?oF{JhOem@*hSK{9ec%(yv~Wj~{@HUkR-8<1-R#6aMn0OT73 z8O%To61Rr(LE1oKAobEf+6;(60Hod=NHYR4+vbIA(-|Wi8Cbzan1H1j7{r0J9Z)lf n53&X%57J@*#411xGRhWc49Gf5AO?wp)Pt-9@&5u1w*X=QZ0{ZK