diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-08 18:12:24 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-08 18:52:48 +0300 |
commit | 8c5c02932f20dac55675448dae4dbccbbc34aaf8 (patch) | |
tree | eaae24ec9a57a59e1786f8ee8ea3527ac08342f7 /source/blender/draw/modes/shaders | |
parent | 8d3e2ffa07576561d44a6f1e2aa4cccd765b5396 (diff) |
Wireframe: Refactor vertex shader to use less matrices
This means less matrices needs to be prepared by the CPU.
Diffstat (limited to 'source/blender/draw/modes/shaders')
-rw-r--r-- | source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl | 52 |
1 files changed, 20 insertions, 32 deletions
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl index 96acba71233..d73f0bdb609 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -1,8 +1,10 @@ uniform mat4 ProjectionMatrix; -uniform mat4 ModelViewMatrix; +uniform mat4 ViewMatrix; +uniform mat4 ViewMatrixInverse; + uniform mat4 ModelMatrix; -uniform mat3 NormalMatrix; +uniform mat4 ModelMatrixInverse; uniform float wireStepParam; uniform float ofs; @@ -11,57 +13,43 @@ in vec3 pos; in vec3 nor; in float wd; /* wiredata */ -#ifndef USE_SCULPT float get_edge_sharpness(float wd) { +#ifndef USE_SCULPT return ((wd == 0.0) ? -1.5 : wd) + wireStepParam; -} #else -float get_edge_sharpness(float wd) -{ return 1.0; -} #endif +} + +#define transform_normal_to_world(nor) (transpose(mat3(ModelMatrixInverse)) * nor) /* Geometry shader version */ #if defined(SELECT_EDGES) || defined(USE_GEOM) out float facing_g; out float edgeSharpness_g; -void main() -{ - edgeSharpness_g = get_edge_sharpness(wd); - - mat4 projmat = ProjectionMatrix; - projmat[3][2] -= ofs; - - gl_Position = projmat * (ModelViewMatrix * vec4(pos, 1.0)); - - facing_g = normalize(NormalMatrix * nor).z; - -# ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz); -# endif -} - #else /* USE_GEOM */ out float facing; flat out float edgeSharpness; +# define facing_g facing +# define edgeSharpness_g edgeSharpness + +#endif /* SELECT_EDGES */ void main() { - edgeSharpness = get_edge_sharpness(wd); - mat4 projmat = ProjectionMatrix; projmat[3][2] -= ofs; - gl_Position = projmat * (ModelViewMatrix * vec4(pos, 1.0)); + vec4 wpos = ModelMatrix * vec4(pos, 1.0); + gl_Position = projmat * (ViewMatrix * wpos); - facing = normalize(NormalMatrix * nor).z; + vec3 wnor = normalize(transform_normal_to_world(nor)); + facing_g = dot(wnor, ViewMatrixInverse[2].xyz); + edgeSharpness_g = get_edge_sharpness(wd); -# ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance((ModelMatrix * vec4(pos, 1.0)).xyz); -# endif +#ifdef USE_WORLD_CLIP_PLANES + world_clip_planes_calc_clip_distance(wpos.xyz); +#endif } - -#endif /* SELECT_EDGES */ |