diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-04-27 17:27:47 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-02 21:49:38 +0300 |
commit | 8c2a6f957ada6cca4b870c094979f9c3e6d43fa7 (patch) | |
tree | bfb4e9f8d5d13db5b13741fe0c112d94cc36de79 /source/blender/draw/intern/draw_armature.c | |
parent | a56561dcd28d5a8ee45948afb62cc7296c212a44 (diff) |
Armature: "Raytrace" bones endpoint spheres.
Here is how it works:
We render a high poly disc that we orient & scale towards the camera so that
it covers the same pixel of the sphere it's supposed to represent.
Then the pixel shader raytrace the sphere (effectively starting from
the poly disc depth) and outputs the depth to gl_FragDepth.
This approach has many benefit:
- high quality obviously: per pixel accurate depth!
- compatible with MSAA: since the sphere horizon is delimited by polygons,
we get the coverage computed by the rasterizer. However we still gets
aliasing if the sphere intersect directly other meshes.
- virtually no overdraw: there is no backface to shade but we still get
overdraw because by little triangle [gpus rasterize pixel by groups of 4].
- allows early depth test: since the poly disc is set at the nearest depth
we can output, we can use GL_ARB_conservative_depth to enable early depth
test and discard pixels that are already behind geometry.
- can draw outline pretty easily without geometry shader.
Diffstat (limited to 'source/blender/draw/intern/draw_armature.c')
-rw-r--r-- | source/blender/draw/intern/draw_armature.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c index 195acfb7c1f..756cc3e6992 100644 --- a/source/blender/draw/intern/draw_armature.c +++ b/source/blender/draw/intern/draw_armature.c @@ -250,8 +250,12 @@ static void drw_shgroup_bone_custom_wire(const float (*bone_mat)[4], const float static void drw_shgroup_bone_point_solid(const float (*bone_mat)[4], const float color[4]) { if (g_data.bone_point_solid == NULL) { - struct Gwn_Batch *geom = DRW_cache_bone_point_get(); +#if 0 /* old style geometry sphere */ + struct Gwn_Batch *geom = DRW_cache_bone_point_get() g_data.bone_point_solid = shgroup_instance_solid(g_data.pass_bone_solid, geom); +#else /* new style raytraced sphere */ + g_data.bone_point_solid = shgroup_instance_armature_sphere(g_data.pass_bone_solid); +#endif } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); @@ -261,8 +265,12 @@ static void drw_shgroup_bone_point_solid(const float (*bone_mat)[4], const float static void drw_shgroup_bone_point_wire(const float (*bone_mat)[4], const float color[4]) { if (g_data.bone_point_wire == NULL) { +#if 0 /* old style 3 axis circles */ struct Gwn_Batch *geom = DRW_cache_bone_point_wire_outline_get(); g_data.bone_point_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom); +#else /* new style contour outline */ + g_data.bone_point_wire = shgroup_instance_armature_sphere_outline(g_data.pass_bone_wire); +#endif } float final_bonemat[4][4]; mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); |