... | ... |
@@ -2,11 +2,49 @@ |
2 | 2 |
|
3 | 3 |
A [GLSL][]/[OpenGL][] [\>=3.2][] [normal][] visualization library. |
4 | 4 |
|
5 |
+A [geometry shader][] is used to visualize the normals from the same geometry |
|
6 |
+as when drawing normally. |
|
7 |
+ |
|
5 | 8 |
[`glvisnormals`]: https://git.rcrnstn.net/rcrnstn/glvisnormals |
6 | 9 |
[GLSL]: https://en.wikipedia.org/wiki/OpenGL_Shading_Language |
7 | 10 |
[OpenGL]: https://en.wikipedia.org/wiki/OpenGL |
8 | 11 |
[\>=3.2]: https://en.wikipedia.org/wiki/OpenGL#Version_history |
9 | 12 |
[normal]: https://en.wikipedia.org/wiki/Normal_(geometry) |
13 |
+[geometry shader]: https://www.khronos.org/opengl/wiki/Geometry_Shader |
|
14 |
+ |
|
15 |
+## Requirements |
|
16 |
+ |
|
17 |
+[Geometry shader][]s require OpenGL [\>=3.2][] or the |
|
18 |
+[`ARB_geometry_shader4`][] extension. |
|
19 |
+ |
|
20 |
+[`ARB_geometry_shader4`]: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_geometry_shader4.txt |
|
21 |
+ |
|
22 |
+## Usage |
|
23 |
+ |
|
24 |
+Link the shader program with: |
|
25 |
+ |
|
26 |
+- `visnormals.vert` |
|
27 |
+- `visnormals.geom` |
|
28 |
+- `visnormals.frag` |
|
29 |
+ |
|
30 |
+The following vertex attributes need to be set: |
|
31 |
+ |
|
32 |
+- `vec3 vert_position` |
|
33 |
+- `vec3 vert_normal` (assumed to be of unit length) |
|
34 |
+- `mat4 vert_model` (assumed to be an isometry, i.e. no scaling or skewing) |
|
35 |
+ |
|
36 |
+The following uniforms need to be set: |
|
37 |
+ |
|
38 |
+- `mat4 view_projection` |
|
39 |
+- `float scale` |
|
40 |
+- `vec4 color` |
|
41 |
+ |
|
42 |
+The following outputs are written by the fragment shader: |
|
43 |
+ |
|
44 |
+- ` vec4 frag_color` |
|
45 |
+ |
|
46 |
+Make the shader program current and issue the same draw call as would be done |
|
47 |
+when drawing normally. |
|
10 | 48 |
|
11 | 49 |
## Build system |
12 | 50 |
|
0 | 14 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,32 @@ |
1 |
+#version 150 |
|
2 |
+ |
|
3 |
+ |
|
4 |
+layout(triangles) in; |
|
5 |
+layout(line_strip, max_vertices = 6) out; |
|
6 |
+ |
|
7 |
+ |
|
8 |
+uniform mat4 view_projection; |
|
9 |
+uniform float scale; |
|
10 |
+ |
|
11 |
+ |
|
12 |
+in vec4 geom_normal[3]; |
|
13 |
+ |
|
14 |
+ |
|
15 |
+void primitive_(int i) |
|
16 |
+{ |
|
17 |
+ gl_Position = view_projection * |
|
18 |
+ (gl_in[i].gl_Position); |
|
19 |
+ EmitVertex(); |
|
20 |
+ gl_Position = view_projection * |
|
21 |
+ (gl_in[i].gl_Position + scale * geom_normal[i]); |
|
22 |
+ EmitVertex(); |
|
23 |
+ EndPrimitive(); |
|
24 |
+} |
|
25 |
+ |
|
26 |
+ |
|
27 |
+void main() |
|
28 |
+{ |
|
29 |
+ primitive_(0); |
|
30 |
+ primitive_(1); |
|
31 |
+ primitive_(2); |
|
32 |
+} |
0 | 33 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,16 @@ |
1 |
+#version 150 |
|
2 |
+ |
|
3 |
+ |
|
4 |
+in vec3 vert_position; |
|
5 |
+in vec3 vert_normal; |
|
6 |
+in mat4 vert_model; |
|
7 |
+ |
|
8 |
+ |
|
9 |
+out vec4 geom_normal; |
|
10 |
+ |
|
11 |
+ |
|
12 |
+void main() |
|
13 |
+{ |
|
14 |
+ gl_Position = vert_model * vec4(vert_position, 1); |
|
15 |
+ geom_normal = vert_model * vec4(vert_normal, 0); |
|
16 |
+} |