diff options
author | Germano <germano.costa@ig.com.br> | 2018-01-15 21:29:41 +0300 |
---|---|---|
committer | Germano <germano.costa@ig.com.br> | 2018-01-15 21:29:41 +0300 |
commit | b810e9ffc4bb03bdf7773b4311ac841b00af80d1 (patch) | |
tree | 37df9f0922d42ed420efe862fe74fc92b77f7729 /source/blender/draw/modes | |
parent | 7183d15d974c4a1df92461e166f17b4d0ac14950 (diff) |
Fix: Mesh Edit Mode Shader: Correct artifacts that appeared on edges of edit mode with some AMD GPUs
In case the problem appeared with the `AMD Radeon HD 7570M`
Diffstat (limited to 'source/blender/draw/modes')
-rw-r--r-- | source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl index 65b1baff37a..d9c902697b6 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl @@ -106,7 +106,7 @@ vec4 getClipData(vec2 pos[3], ivec2 vidx) return vec4(A, Adir); } -void doVertex(int v, vec4 pos) +void doVertex(int v) { #ifdef VERTEX_SELECTION vertexColor = getVertexColor(v); @@ -116,7 +116,16 @@ void doVertex(int v, vec4 pos) facing = vFacing[v]; #endif - gl_Position = pos; + gl_Position = pPos[v]; + + EmitVertex(); +} + +void doLoopStrip(int v, vec3 offset) +{ + doVertex(v); + + gl_Position.xyz += offset; EmitVertex(); } @@ -174,12 +183,12 @@ void main() /* Only pass the first 2 distances */ for (int v = 0; v < 2; ++v) { eData1[v] = dist(pos, pos[v], v); - doVertex(v, pPos[v]); + doVertex(v); eData1[v] = 0.0; } /* and the last vertex */ - doVertex(2, pPos[2]); + doVertex(2); #ifdef EDGE_FIX vec2 fixvec[6]; @@ -250,8 +259,7 @@ void main() /* Position of the "hidden" third vertex */ eData2[0] = pos[vbe]; - doVertex(v, pPos[v]); - doVertex(v, pPos[v] + vec4(fixvec[v], Z_OFFSET, 0.0)); + doLoopStrip(v, vec3(fixvec[v], Z_OFFSET)); /* Now one triangle only shade one edge * so we use the edge distance calculated @@ -266,20 +274,17 @@ void main() edgesCrease[2] = ecrease[vbe]; edgesBweight[2] = ebweight[vbe]; - doVertex(vaf, pPos[vaf]); - doVertex(vaf, pPos[vaf] + vec4(fixvecaf[v], Z_OFFSET, 0.0)); + doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET)); /* corner vertices should not draw edges but draw point only */ flag[2] = (vData[vbe].x << 8); #ifdef VERTEX_SELECTION - doVertex(vaf, pPos[vaf]); - doVertex(vaf, pPos[vaf] + vec4(cornervec[vaf], Z_OFFSET, 0.0)); + doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET)); #endif } /* finish the loop strip */ - doVertex(2, pPos[2]); - doVertex(2, pPos[2] + vec4(fixvec[2], Z_OFFSET, 0.0)); + doLoopStrip(2, vec3(fixvec[2], Z_OFFSET)); #endif } /* Harder case : compute visible edges vectors */ @@ -295,7 +300,7 @@ void main() eData2[2] = tmp.zw; for (int v = 0; v < 3; ++v) - doVertex(v, pPos[v]); + doVertex(v); } EndPrimitive(); |