Skip to content

Commit

Permalink
Merge pull request #50 from irate-devil/feex-issue
Browse files Browse the repository at this point in the history
Fix lines deforming or disappearing when partially behind the camera
  • Loading branch information
IceSentry authored Jan 26, 2024
2 parents 81172b3 + c2a24df commit bcc2479
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions src/shaders/polyline.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,13 @@ fn vertex(vertex: Vertex) -> VertexOutput {
let position = positions[vertex.index];

// algorithm based on https://wwwtyro.net/2019/11/18/instanced-lines.html
let clip0 = view.view_proj * polyline.model * vec4(vertex.point_a, 1.0);
let clip1 = view.view_proj * polyline.model * vec4(vertex.point_b, 1.0);
var clip0 = view.view_proj * polyline.model * vec4(vertex.point_a, 1.0);
var clip1 = view.view_proj * polyline.model * vec4(vertex.point_b, 1.0);

// Manual near plane clipping to avoid errors when doing the perspective divide inside this shader.
clip0 = clip_near_plane(clip0, clip1);
clip1 = clip_near_plane(clip1, clip0);

let clip = mix(clip0, clip1, position.z);

let resolution = vec2(view.viewport.z, view.viewport.w);
Expand Down Expand Up @@ -89,6 +94,18 @@ fn vertex(vertex: Vertex) -> VertexOutput {
return VertexOutput(vec4(clip.w * ((2.0 * pt) / resolution - 1.0), depth, clip.w), color);
}

fn clip_near_plane(a: vec4<f32>, b: vec4<f32>) -> vec4<f32> {
// Move a if a is behind the near plane and b is in front.
if a.z > a.w && b.z <= b.w {
// Interpolate a towards b until it's at the near plane.
let distance_a = a.z - a.w;
let distance_b = b.z - b.w;
let t = distance_a / (distance_a - distance_b);
return a + (b - a) * t;
}
return a;
}

struct FragmentInput {
@location(0) color: vec4<f32>,
};
Expand Down

0 comments on commit bcc2479

Please sign in to comment.