diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-06-07 17:55:41 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-06-07 19:01:36 +0300 |
commit | f9ca750bdf5e071eb240b55ee1e701e04dd7423c (patch) | |
tree | 873329d9ea6a02ef9de965848374329de89a8879 /source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl | |
parent | 38232871791e88eb8294441c013171113cb61012 (diff) |
Wireframe: Change / Optimize the limited wireframe visibility option.
This make the limited wireframe not a performance problem anymore.
However, this does change the number of edges displayed as the threshold
is now computed per vertex instead of per edges.
For this reason we extended (internaly) the range of the slider so that the
users can hide more edge.
Diffstat (limited to 'source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl | 56 |
1 files changed, 12 insertions, 44 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 96afb8748b6..eca2e6bf530 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -24,9 +24,9 @@ out float facing; #ifdef LIGHT_EDGES #ifdef USE_GEOM_SHADER out vec3 obPos; -out vec3 edgeAdj; +out vec3 vNor; #else -flat out vec3 edgeSharpness; +out float edgeSharpness; #endif #endif @@ -79,11 +79,10 @@ vec3 get_vertex_pos(int v_id) return pos; } -float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2) +float get_edge_sharpness(vec3 fnor, vec3 vnor) { - vec3 n0 = normalize(cross(e0, e1)); - vec3 n1 = normalize(cross(e1, e2)); - return dot(n0, n1); + float sharpness = abs(dot(fnor, vnor)); + return smoothstep(wireStepParam.x, wireStepParam.y, sharpness); } #define NO_EDGE vec3(10000.0); @@ -91,12 +90,7 @@ float get_edge_sharpness(vec3 e0, vec3 e1, vec3 e2) void main() { #ifdef USE_GEOM_SHADER - -# ifdef LIGHT_EDGES - int v_id = texelFetch(faceIds, gl_VertexID * 2).r; -# else int v_id = texelFetch(faceIds, gl_VertexID).r; -# endif bool do_edge = v_id < 0; v_id = abs(v_id) - 1; @@ -110,27 +104,19 @@ void main() ssPos = proj(gl_Position); # ifdef LIGHT_EDGES - int adj_id = texelFetch(faceIds, gl_VertexID * 2 + 1).r; obPos = pos; - edgeAdj = get_vertex_pos(adj_id); + vNor = nor; # endif #else - -# ifdef LIGHT_EDGES - int v_0 = (gl_VertexID / 3) * 6; - ivec2 ofs = ivec2(2, 4); /* GL_TRIANGLE_ADJACENCY */ -# else int v_0 = (gl_VertexID / 3) * 3; - ivec2 ofs = ivec2(1, 2); /* GL_TRIANGLES */ -# endif int v_n = gl_VertexID % 3; /* Getting the same positions for each of the 3 verts. */ ivec3 v_id; v_id.x = texelFetch(faceIds, v_0).r; - v_id.y = texelFetch(faceIds, v_0 + ofs.x).r; - v_id.z = texelFetch(faceIds, v_0 + ofs.y).r; + v_id.y = texelFetch(faceIds, v_0 + 1).r; + v_id.z = texelFetch(faceIds, v_0 + 2).r; bvec3 do_edge = lessThan(v_id, ivec3(0)); v_id = abs(v_id) - 1; @@ -158,30 +144,12 @@ void main() gl_Position = p_pos[v_n]; vec3 nor = get_vertex_nor(v_id[v_n]); - facing = normalize(NormalMatrix * nor).z; + vec3 vnor = normalize(NormalMatrix * nor); + facing = vnor.z; # ifdef LIGHT_EDGES - ivec3 adj_id; - adj_id.x = texelFetch(faceIds, v_0 + 1).r; - adj_id.y = texelFetch(faceIds, v_0 + 3).r; - adj_id.z = texelFetch(faceIds, v_0 + 5).r; - - vec3 adj_pos[3]; - adj_pos[0] = get_vertex_pos(adj_id.x); - adj_pos[1] = get_vertex_pos(adj_id.y); - adj_pos[2] = get_vertex_pos(adj_id.z); - - vec3 edges[3]; - edges[0] = pos[1] - pos[0]; - edges[1] = pos[2] - pos[1]; - edges[2] = pos[0] - pos[2]; - - edgeSharpness.x = get_edge_sharpness(adj_pos[0] - pos[0], edges[0], -edges[2]); - edgeSharpness.y = get_edge_sharpness(adj_pos[1] - pos[1], edges[1], -edges[0]); - edgeSharpness.z = get_edge_sharpness(adj_pos[2] - pos[2], edges[2], -edges[1]); - - /* Easy to adjust parameters. */ - edgeSharpness = smoothstep(wireStepParam.xxx, wireStepParam.yyy, edgeSharpness); + vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0])); + edgeSharpness = get_edge_sharpness(fnor, nor); # endif #endif |