diff options
author | Jacques Lucke <mail@jlucke.com> | 2018-11-14 20:41:28 +0300 |
---|---|---|
committer | Jacques Lucke <mail@jlucke.com> | 2018-11-14 20:41:33 +0300 |
commit | 78207eac9b9b576ae66731ea257103f84b0ea41b (patch) | |
tree | c67180328cae384c6aaea72eda2aeb27e135ddec /doc/python_api | |
parent | 6f08124fbd1265dc42edfcb0f7bafe21c08d1827 (diff) |
Py API Docs: New custom shader example
Diffstat (limited to 'doc/python_api')
-rw-r--r-- | doc/python_api/examples/gpu.11.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/doc/python_api/examples/gpu.11.py b/doc/python_api/examples/gpu.11.py new file mode 100644 index 00000000000..61e7a842a59 --- /dev/null +++ b/doc/python_api/examples/gpu.11.py @@ -0,0 +1,61 @@ +""" +Custom Shader for dotted 3D Line +-------------------------------- + +In this example the arc length (distance to the first point on the line) is calculated in every vertex. +Between the vertex and fragment shader that value is automatically interpolated for all points that will be visible on the screen. +In the fragment shader the `sin` of the arc length is calculated. +Based on the result a decision is made on whether the fragment should be drawn or not. +""" +import bpy +import gpu +from random import random +from mathutils import Vector +from gpu_extras.batch import batch_for_shader + +vertex_shader = ''' + uniform mat4 u_ViewProjectionMatrix; + + in vec3 position; + in float arcLength; + + out float v_ArcLength; + + void main() + { + v_ArcLength = arcLength; + gl_Position = u_ViewProjectionMatrix * vec4(position, 1.0f); + } +''' + +fragment_shader = ''' + uniform float u_Scale; + + in float v_ArcLength; + + void main() + { + if (step(sin(v_ArcLength * u_Scale), 0.5) == 1) discard; + gl_FragColor = vec4(1.0); + } +''' + +coords = [Vector((random(), random(), random())) * 5 for _ in range(5)] + +arc_lengths = [0] +for a, b in zip(coords[:-1], coords[1:]): + arc_lengths.append(arc_lengths[-1] + (a - b).length) + +shader = gpu.types.GPUShader(vertex_shader, fragment_shader) +batch = batch_for_shader(shader, 'LINE_STRIP', + {"position" : coords, + "arcLength" : arc_lengths}) + +def draw(): + shader.bind() + matrix = bpy.context.region_data.perspective_matrix + shader.uniform_float("u_ViewProjectionMatrix", matrix) + shader.uniform_float("u_Scale", 10) + batch.draw(shader) + +bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW')
\ No newline at end of file |