diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-06-03 16:13:33 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-06-03 16:26:37 +0300 |
commit | d0f7ab27a898757fe444ac778bf072c268042feb (patch) | |
tree | 14cb3b26759d65052e50b9bed3bd4e6ee281722f /source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl | |
parent | 778a19a13a1cd9a84563ca66653861b79651d2a5 (diff) |
Wireframe: Optimization for intel GPUs.
Intel GPU take more advantage of the geometry shader than other vendors.
Using a simple geom shader approach in this case is more performant.
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 | 28 |
1 files changed, 27 insertions, 1 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 67f4a5c7668..2cd888e7537 100644 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl @@ -1,3 +1,8 @@ + +#ifdef GPU_INTEL +#define USE_GEOM_SHADER +#endif + uniform mat4 ModelViewProjectionMatrix; uniform mat4 ModelViewMatrix; uniform mat4 ProjectionMatrix; @@ -9,10 +14,15 @@ uniform float nearDist; uniform samplerBuffer vertData; uniform isamplerBuffer faceIds; +#ifdef USE_GEOM_SHADER +out vec2 ssPos; +out float facingOut; /* abs(facing) > 1.0 if we do edge */ +#else flat out vec3 ssVec0; flat out vec3 ssVec1; flat out vec3 ssVec2; out float facing; +#endif /* project to screen space */ vec2 proj(vec4 pos) @@ -67,6 +77,21 @@ vec3 get_vertex_pos(int v_id) void main() { +#ifdef USE_GEOM_SHADER + int v_id = texelFetch(faceIds, gl_VertexID).r; + + bool do_edge = v_id < 0; + v_id = abs(v_id) - 1; + + vec3 pos = get_vertex_pos(v_id); + vec3 nor = get_vertex_nor(v_id); + facingOut = normalize(NormalMatrix * nor).z; + facingOut += (do_edge) ? ((facingOut > 0.0) ? 2.0 : -2.0) : 0.0; + + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + ssPos = proj(gl_Position); + +#else int v_0 = (gl_VertexID / 3) * 3; int v_n = gl_VertexID % 3; @@ -102,5 +127,6 @@ void main() gl_Position = p_pos[v_n]; vec3 nor = get_vertex_nor(v_id[v_n]); - facing = (NormalMatrix * nor).z; + facing = normalize(NormalMatrix * nor).z; +#endif } |