Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano <germano.costa@ig.com.br>2018-01-15 21:29:41 +0300
committerGermano <germano.costa@ig.com.br>2018-01-15 21:29:41 +0300
commitb810e9ffc4bb03bdf7773b4311ac841b00af80d1 (patch)
tree37df9f0922d42ed420efe862fe74fc92b77f7729 /source/blender/draw/modes
parent7183d15d974c4a1df92461e166f17b4d0ac14950 (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.glsl31
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();