diff options
Diffstat (limited to 'source/blender/draw/modes/shaders')
7 files changed, 152 insertions, 136 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl index bdf3ef267e9..b37862f2037 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl @@ -12,6 +12,10 @@ #define VERTEX_SELECTED (1 << 1) #define VERTEX_EXISTS (1 << 2) +#define FACE_ACTIVE (1 << 3) +#define FACE_SELECTED (1 << 4) +#define FACE_FREESTYLE (1 << 5) + uniform bool doEdges = true; vec4 EDIT_MESH_edge_color_outer(int edge_flag, bool face_active, float crease, float bweight) diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl index 92eb00d4dcc..31cebc84461 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl @@ -2,13 +2,6 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - -/* This is not perfect. Only a subset of intel gpus are affected. - * This fix have some performance impact. - * TODO Refine the range to only affect GPUs. */ - uniform float faceAlphaMod; uniform float edgeScale; @@ -23,12 +16,12 @@ in vec3 vertexColor; in float facing; #endif -flat in vec2 ssPos[3]; +in vec3 barycentric; out vec4 FragColor; /* Vertex flag is shifted and combined with the edge flag */ -#define FACE_ACTIVE (1 << (3 + 8)) +#define FACE_ACTIVE_ (FACE_ACTIVE << 8) #define LARGE_EDGE_SIZE 3.0 @@ -61,12 +54,15 @@ void colorDistEdge(vec4 color, float dist) void main() { - vec3 e, p; - /* Step 1 : Computing Distances */ - distToEdgeAndPoint((ssPos[1] - ssPos[0]) + 1e-8, ssPos[0], e.z, p.x); - distToEdgeAndPoint((ssPos[2] - ssPos[1]) + 1e-8, ssPos[1], e.x, p.y); - distToEdgeAndPoint((ssPos[0] - ssPos[2]) + 1e-8, ssPos[2], e.y, p.z); + vec3 dx = dFdx(barycentric); + vec3 dy = dFdy(barycentric); + vec3 d = vec3( + length(vec2(dx.x, dy.x)), + length(vec2(dx.y, dy.y)), + length(vec2(dx.z, dy.z)) + ); + vec3 e = abs(vec3(barycentric / d)); /* Step 2 : coloring (order dependent) */ @@ -82,7 +78,7 @@ void main() /* Outer large edge */ float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE; - vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0]& FACE_ACTIVE) != 0, edgesCrease[v], edgesBweight[v]); + vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]); if (large_edge_color.a != 0.0) { colorDistEdge(large_edge_color, largeEdge); @@ -97,12 +93,13 @@ void main() #ifdef VERTEX_SELECTION colorDistEdge(vec4(vertexColor, 1.0), innerEdge); #else - vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0]& FACE_ACTIVE) != 0); + vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0); colorDistEdge(inner_edge_color, innerEdge); #endif } } +#if 0 /* Points */ #ifdef VERTEX_SELECTION for (int v = 0; v < 3; ++v) { @@ -120,11 +117,11 @@ void main() } } #endif +#endif #ifdef VERTEX_FACING FragColor.a *= 1.0 - abs(facing) * 0.4; #endif - /* don't write depth if not opaque */ if (FragColor.a == 0.0) discard; } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl index 68fcc33acff..0368f170cb1 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl @@ -2,11 +2,8 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - layout(lines) in; -layout(triangle_strip, max_vertices=6) out; +layout(triangle_strip, max_vertices=4) out; uniform mat4 ProjectionMatrix; uniform vec2 viewportSize; @@ -24,6 +21,7 @@ flat out vec3 edgesCrease; flat out vec3 edgesBweight; flat out vec4 faceColor; flat out ivec3 flag; +out vec3 barycentric; #ifdef VERTEX_SELECTION out vec3 vertexColor; #endif @@ -34,9 +32,6 @@ out float facing; /* See fragment shader */ flat out vec2 ssPos[3]; -#define FACE_ACTIVE (1 << 3) -#define FACE_SELECTED (1 << 4) - /* project to screen space */ vec2 proj(vec4 pos) { @@ -94,20 +89,21 @@ void main() ssPos[1] = pos[1]; flag[0] = flag[2] = (vData[0].x << 8); flag[1] = (vData[1].x << 8); - - doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0)); + barycentric = vec3(1.0); doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0)); + + barycentric[2] = -1.0; doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0)); flag[2] |= vData[0].y; edgesCrease[2] = vData[0].z / 255.0; edgesBweight[2] = vData[0].w / 255.0; + barycentric = vec3(1.0); doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0)); - doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0)); - flag[2] = 0; - doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0)); + barycentric[2] = -1.0; + doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0)); EndPrimitive(); } 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 d020bcc6951..ccdf81bff7d 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 @@ -2,30 +2,14 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - layout(triangles) in; -/* This is not perfect. Only a subset of intel gpus are affected. - * This fix have some performance impact. - * TODO Refine the range to only affect GPUs. */ - -#ifdef EDGE_FIX /* To fix the edge artifacts, we render * an outline strip around the screenspace * triangle. Order is important. * TODO diagram */ - -#ifdef VERTEX_SELECTION -layout(triangle_strip, max_vertices=23) out; -#else -layout(triangle_strip, max_vertices=17) out; -#endif -#else -layout(triangle_strip, max_vertices=3) out; -#endif +layout(triangle_strip, max_vertices=15) out; uniform mat4 ProjectionMatrix; uniform vec2 viewportSize; @@ -43,7 +27,8 @@ flat out vec3 edgesCrease; flat out vec3 edgesBweight; flat out vec4 faceColor; flat out ivec3 flag; -flat out int clipCase; + +out vec3 barycentric; #ifdef VERTEX_SELECTION out vec3 vertexColor; #endif @@ -51,13 +36,6 @@ out vec3 vertexColor; out float facing; #endif -/* See fragment shader */ -flat out vec2 ssPos[3]; - -#define FACE_ACTIVE (1 << 3) -#define FACE_SELECTED (1 << 4) -#define FACE_FREESTYLE (1 << 5) - /* project to screen space */ vec2 proj(vec4 pos) { @@ -73,8 +51,9 @@ void doVertex(int v) #ifdef VERTEX_FACING facing = vFacing[v]; #endif - gl_Position = pPos[v]; + barycentric = vec3(0.0); + barycentric[v % 3] = 1.0; EmitVertex(); } @@ -84,6 +63,7 @@ void doLoopStrip(int v, vec3 offset) doVertex(v); gl_Position.xyz += offset; + barycentric = vec3(1.0); EmitVertex(); } @@ -115,6 +95,7 @@ void main() faceColor = colorFace; /* Vertex */ + vec2 ssPos[3]; ssPos[0] = proj(pPos[0]); ssPos[1] = proj(pPos[1]); ssPos[2] = proj(pPos[2]); @@ -123,10 +104,8 @@ void main() doVertex(1); doVertex(2); -#ifdef EDGE_FIX vec2 fixvec[6]; vec2 fixvecaf[6]; - vec2 cornervec[3]; /* This fix the case when 2 vertices are perfectly aligned * and corner vectors have nowhere to go. @@ -150,8 +129,6 @@ void main() vec2 dir = normalize(v2 - v1); vec2 dir2 = normalize(v3 - v1); - cornervec[i] = -normalize(dir + dir2); - /* perpendicular to dir */ vec2 perp = vec2(-dir.y, dir.x); @@ -162,7 +139,6 @@ void main() /* Make it view independent */ perp *= sizeEdgeFix / viewportSize; - cornervec[i] *= sizeEdgeFix / viewportSize; fixvec[i] = fixvecaf[i] = perp; /* Perspective */ @@ -171,7 +147,6 @@ void main() * our fixvec to be flipped */ fixvec[i] *= -vPos[i].z; fixvecaf[i] *= -vPos[i1].z; - cornervec[i] *= -vPos[i].z; } } @@ -195,16 +170,6 @@ void main() flag[v] &= ~EDGE_EXISTS; doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET)); - /* corner vertices should not draw edges but draw point only */ - flag[vbe] &= ~EDGE_EXISTS; -#ifdef VERTEX_SELECTION - doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET)); -#endif + EndPrimitive(); } - - /* finish the loop strip */ - doLoopStrip(2, vec3(fixvec[2], Z_OFFSET)); -#endif - - EndPrimitive(); } diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl deleted file mode 100644 index 13d824c2410..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl +++ /dev/null @@ -1,52 +0,0 @@ - -/* Solid Wirefram implementation - * Mike Erwin, Clément Foucault */ - -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - -uniform mat4 ModelViewProjectionMatrix; -uniform vec2 viewportSize; - -in vec3 pos; -in ivec4 data; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out vec3 edgesCrease; -flat out vec3 edgesBweight; -flat out vec4 faceColor; -flat out ivec3 flag; -#ifdef VERTEX_SELECTION -out vec3 vertexColor; -#endif - -/* See fragment shader */ -flat out vec2 ssPos[3]; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void main() -{ - edgesCrease = vec3(0.0); - edgesBweight = vec3(0.0); - - vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); - - /* there is no face */ - faceColor = vec4(0.0); - -#ifdef VERTEX_SELECTION - vertexColor = vec3(0.0); -#endif - - ssPos[0] = ssPos[1] = ssPos[2] = proj(pPos); - flag[0] = flag[1] = flag[2] = (data.x << 8); - - gl_PointSize = sizeEdgeFix; - gl_Position = pPos; -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl new file mode 100644 index 00000000000..484a017e171 --- /dev/null +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl @@ -0,0 +1,41 @@ + +uniform mat3 NormalMatrix; +uniform mat4 ProjectionMatrix; +uniform mat4 ModelViewMatrix; +uniform mat4 ModelViewProjectionMatrix; +uniform float ofs = 5e-5; + +in vec3 pos; +in ivec4 data; +#ifdef VERTEX_FACING +in vec3 vnor; +#endif + +out vec4 finalColor; + +void main() +{ + finalColor = colorVertex; + finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor; + finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor; + + gl_PointSize = sizeVertex * 2.0; + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + gl_Position -= ofs; + +#ifdef VERTEX_FACING + vec4 vPos = ModelViewMatrix * vec4(pos, 1.0); + vec3 view_normal = normalize(NormalMatrix * vnor); + vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) + ? normalize(vPos.xyz) + : vec3(0.0, 0.0, 1.0); + float facing = dot(view_vec, view_normal); + + finalColor.a *= 1.0 - abs(facing) * 0.4; +#endif + + if ((data.x & VERTEX_EXISTS) == 0) { + gl_Position = vec4(0.0); + gl_PointSize = 0.0; + } +} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl index 7cab2a5035f..8715ab69181 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl @@ -2,38 +2,103 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - +uniform mat3 NormalMatrix; +uniform mat4 ProjectionMatrix; uniform mat4 ModelViewMatrix; uniform mat4 ModelViewProjectionMatrix; uniform ivec4 dataMask = ivec4(0xFF); +uniform float ofs = 1e-5; + +uniform isamplerBuffer dataBuffer; + in vec3 pos; +#ifdef VERTEX_FACING +in vec3 vnor; +#endif + +#ifdef EDGE_FIX in ivec4 data; out vec4 vPos; out vec4 pPos; out ivec4 vData; - -#ifdef VERTEX_FACING -uniform mat4 ProjectionMatrix; -uniform mat3 NormalMatrix; - -in vec3 vnor; +# ifdef VERTEX_FACING out float vFacing; -#endif +# endif void main() { vPos = ModelViewMatrix * vec4(pos, 1.0); pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); + pPos.z -= ofs; vData = data & dataMask; -#ifdef VERTEX_FACING +# ifdef VERTEX_FACING vec3 view_normal = normalize(NormalMatrix * vnor); vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vPos.xyz) : vec3(0.0, 0.0, 1.0); vFacing = dot(view_vec, view_normal); -#endif +# endif } + +#else /* EDGE_FIX */ + +flat out vec3 edgesCrease; +flat out vec3 edgesBweight; +flat out vec4 faceColor; +flat out ivec3 flag; +# ifdef VERTEX_SELECTION +out vec3 vertexColor; +# endif +# ifdef VERTEX_FACING +out float facing; +# endif + +out vec3 barycentric; + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + gl_Position.z -= ofs; + + int v_0 = (gl_VertexID / 3) * 3; + int vidx = gl_VertexID % 3; + barycentric = vec3(0.0); + barycentric[vidx] = 1.0; + + /* Edge */ + ivec4 vData[3], data = ivec4(0); + ivec3 eflag; + for (int v = 0; v < 3; ++v) { + data = texelFetch(dataBuffer, v_0 + v); + vData[v] = data & dataMask; + flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8); + edgesCrease[v] = vData[v].z / 255.0; + edgesBweight[v] = vData[v].w / 255.0; + } + + /* Face */ + if ((vData[0].x & FACE_ACTIVE) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_SELECTED) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_FREESTYLE) != 0) + faceColor = colorFaceFreestyle; + else + faceColor = colorFace; + +# ifdef VERTEX_SELECTION + vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb; +# endif +# ifdef VERTEX_FACING + vec4 vPos = ModelViewMatrix * vec4(pos, 1.0); + vec3 view_normal = normalize(NormalMatrix * vnor); + vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) + ? normalize(vPos.xyz) + : vec3(0.0, 0.0, 1.0); + facing = dot(view_vec, view_normal); +# endif +} + +#endif
\ No newline at end of file |