forked from john-chapman/im3d
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathim3d.glsl
109 lines (88 loc) · 2.91 KB
/
im3d.glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#if !defined(POINTS) && !defined(LINES) && !defined(TRIANGLES)
#error No primitive type defined
#endif
#if !defined(VERTEX_SHADER) && !defined(GEOMETRY_SHADER) && !defined(FRAGMENT_SHADER)
#error No shader stage defined
#endif
#define VertexData \
_VertexData { \
noperspective float m_edgeDistance; \
noperspective float m_size; \
smooth vec4 m_color; \
}
#define kAntialiasing 2.0
#ifdef VERTEX_SHADER
uniform mat4 uViewProjMatrix;
layout(location=0) in vec4 aPositionSize;
layout(location=1) in vec4 aColor;
out VertexData vData;
void main()
{
vData.m_color = aColor.abgr; // swizzle to correct endianness
#if !defined(TRIANGLES)
vData.m_color.a *= smoothstep(0.0, 1.0, aPositionSize.w / kAntialiasing);
#endif
vData.m_size = max(aPositionSize.w, kAntialiasing);
gl_Position = uViewProjMatrix * vec4(aPositionSize.xyz, 1.0);
#if defined(POINTS)
gl_PointSize = vData.m_size;
#endif
}
#endif
#ifdef GEOMETRY_SHADER
// expand line -> triangle strip
layout(lines) in;
layout(triangle_strip, max_vertices = 4) out;
uniform vec2 uViewport;
in VertexData vData[];
out VertexData vDataOut;
void main()
{
vec2 pos0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w;
vec2 pos1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w;
vec2 dir = pos0 - pos1;
dir = normalize(vec2(dir.x, dir.y * uViewport.y / uViewport.x)); // correct for aspect ratio
vec2 tng0 = vec2(-dir.y, dir.x);
vec2 tng1 = tng0 * vData[1].m_size / uViewport;
tng0 = tng0 * vData[0].m_size / uViewport;
// line start
gl_Position = vec4((pos0 - tng0) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw);
vDataOut.m_edgeDistance = -vData[0].m_size;
vDataOut.m_size = vData[0].m_size;
vDataOut.m_color = vData[0].m_color;
EmitVertex();
gl_Position = vec4((pos0 + tng0) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw);
vDataOut.m_color = vData[0].m_color;
vDataOut.m_edgeDistance = vData[0].m_size;
vDataOut.m_size = vData[0].m_size;
EmitVertex();
// line end
gl_Position = vec4((pos1 - tng1) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw);
vDataOut.m_edgeDistance = -vData[1].m_size;
vDataOut.m_size = vData[1].m_size;
vDataOut.m_color = vData[1].m_color;
EmitVertex();
gl_Position = vec4((pos1 + tng1) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw);
vDataOut.m_color = vData[1].m_color;
vDataOut.m_size = vData[1].m_size;
vDataOut.m_edgeDistance = vData[1].m_size;
EmitVertex();
}
#endif
#ifdef FRAGMENT_SHADER
in VertexData vData;
layout(location=0) out vec4 fResult;
void main()
{
fResult = vData.m_color;
#if defined(LINES)
float d = abs(vData.m_edgeDistance) / vData.m_size;
d = smoothstep(1.0, 1.0 - (kAntialiasing / vData.m_size), d);
fResult.a *= d;
#elif defined(POINTS)
float d = length(gl_PointCoord.xy - vec2(0.5));
d = smoothstep(0.5, 0.5 - (kAntialiasing / vData.m_size), d);
fResult.a *= d;
#endif
}
#endif