#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 = 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); // 计算线段在屏幕空间的长度(用于抗锯齿) float segmentLength = length(ndcEnd.xy - ndcStart.xy); // 应用虚线模式 float dashPeriod = dashParams.dashSize + dashParams.gapSize; float currentPos = mod(projection + dashParams.dashOffset, dashPeriod); // 抗锯齿处理 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, alpha); }