Fix T80974 GPU: Wide Line emulation shader does not always works
This was caused by points well behind the near clip making the computation of the width wrong. The fix is to clip the line to the near clip plane.
This commit is contained in:
parent
a31a87f894
commit
e90638b911
Notes:
blender-bot
2023-02-14 10:21:10 +01:00
Referenced by issue #81550, Blender 2.91 alpha :The move and rotate tool axis lines change scale. Referenced by issue #80974, Axes overlay when moving an object has become very large (Thick Line Width preference)
|
@ -20,7 +20,23 @@ noperspective out float smoothline;
|
|||
|
||||
#define SMOOTH_WIDTH 1.0
|
||||
|
||||
void do_vertex(const int i, vec2 ofs)
|
||||
/* Clips point to near clip plane before perspective divide. */
|
||||
vec4 clip_line_point_homogeneous_space(vec4 p, vec4 q)
|
||||
{
|
||||
if (p.z < -p.w) {
|
||||
/* Just solves p + (q - p) * A; for A when p.z / p.w = -1.0. */
|
||||
float denom = q.z - p.z + q.w - p.w;
|
||||
if (denom == 0.0) {
|
||||
/* No solution. */
|
||||
return p;
|
||||
}
|
||||
float A = (-p.z - p.w) / denom;
|
||||
p = p + (q - p) * A;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
void do_vertex(const int i, vec4 pos, vec2 ofs)
|
||||
{
|
||||
#if defined(UNIFORM)
|
||||
finalColor = color;
|
||||
|
@ -38,21 +54,22 @@ void do_vertex(const int i, vec2 ofs)
|
|||
#endif
|
||||
|
||||
smoothline = (lineWidth + SMOOTH_WIDTH) * 0.5;
|
||||
gl_Position = gl_in[i].gl_Position;
|
||||
gl_Position.xy += ofs * gl_Position.w;
|
||||
gl_Position = pos;
|
||||
gl_Position.xy += ofs * pos.w;
|
||||
EmitVertex();
|
||||
|
||||
smoothline = -(lineWidth + SMOOTH_WIDTH) * 0.5;
|
||||
gl_Position = gl_in[i].gl_Position;
|
||||
gl_Position.xy -= ofs * gl_Position.w;
|
||||
gl_Position = pos;
|
||||
gl_Position.xy -= ofs * pos.w;
|
||||
EmitVertex();
|
||||
}
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec2 p0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w;
|
||||
vec2 p1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w;
|
||||
vec2 e = normalize((p1 - p0) * viewportSize.xy);
|
||||
vec4 p0 = clip_line_point_homogeneous_space(gl_in[0].gl_Position, gl_in[1].gl_Position);
|
||||
vec4 p1 = clip_line_point_homogeneous_space(gl_in[1].gl_Position, gl_in[0].gl_Position);
|
||||
vec2 e = normalize(((p1.xy / p1.w) - (p0.xy / p0.w)) * viewportSize.xy);
|
||||
|
||||
#if 0 /* Hard turn when line direction changes quadrant. */
|
||||
e = abs(e);
|
||||
vec2 ofs = (e.x > e.y) ? vec2(0.0, 1.0 / e.x) : vec2(1.0 / e.y, 0.0);
|
||||
|
@ -62,8 +79,8 @@ void main(void)
|
|||
ofs /= viewportSize.xy;
|
||||
ofs *= lineWidth + SMOOTH_WIDTH;
|
||||
|
||||
do_vertex(0, ofs);
|
||||
do_vertex(1, ofs);
|
||||
do_vertex(0, p0, ofs);
|
||||
do_vertex(1, p1, ofs);
|
||||
|
||||
EndPrimitive();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue