Fix gizmo line width issue when using perspective (#9067)
# Objective - In bevy_polyline, we discovered an issue that happens when line width is smaller than 1.0 and using perspective. It would sometimes end up negative or NaN. I'm not entirely sure _why_ it happens. ## Solution - Make sure the width doesn't go below 0 before multiplying it with the alpha # Notes Here's a link to the bevy_polyline issue https://github.com/ForesightMiningSoftwareCorporation/bevy_polyline/issues/46 I'm not sure if the solution is correct but it solved the issue in my testing. Co-authored-by: François <mockersf@gmail.com>
This commit is contained in:
parent
cbe13f3aa5
commit
0d7e81ee81
@ -64,7 +64,7 @@ fn vertex(vertex: VertexInput) -> VertexOutput {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Line thinness fade from https://acegikmo.com/shapes/docs/#anti-aliasing
|
// Line thinness fade from https://acegikmo.com/shapes/docs/#anti-aliasing
|
||||||
if line_width < 1. {
|
if line_width > 0.0 && line_width < 1. {
|
||||||
color.a *= line_width;
|
color.a *= line_width;
|
||||||
line_width = 1.;
|
line_width = 1.;
|
||||||
}
|
}
|
||||||
@ -79,10 +79,10 @@ fn vertex(vertex: VertexInput) -> VertexOutput {
|
|||||||
let epsilon = 4.88e-04;
|
let epsilon = 4.88e-04;
|
||||||
// depth * (clip.w / depth)^-depth_bias. So that when -depth_bias is 1.0, this is equal to clip.w
|
// depth * (clip.w / depth)^-depth_bias. So that when -depth_bias is 1.0, this is equal to clip.w
|
||||||
// and when equal to 0.0, it is exactly equal to depth.
|
// and when equal to 0.0, it is exactly equal to depth.
|
||||||
// the epsilon is here to prevent the depth from exceeding clip.w when -depth_bias = 1.0
|
// the epsilon is here to prevent the depth from exceeding clip.w when -depth_bias = 1.0
|
||||||
// clip.w represents the near plane in homogeneous clip space in bevy, having a depth
|
// clip.w represents the near plane in homogeneous clip space in bevy, having a depth
|
||||||
// of this value means nothing can be in front of this
|
// of this value means nothing can be in front of this
|
||||||
// The reason this uses an exponential function is that it makes it much easier for the
|
// The reason this uses an exponential function is that it makes it much easier for the
|
||||||
// user to chose a value that is convenient for them
|
// user to chose a value that is convenient for them
|
||||||
depth = clip.z * exp2(-line_gizmo.depth_bias * log2(clip.w / clip.z - epsilon));
|
depth = clip.z * exp2(-line_gizmo.depth_bias * log2(clip.w / clip.z - epsilon));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user