I've been working on a simple physics engine in 2D, but will translate to 3D after everything works right. Right now I have GJK for collision detection, which will return a 2-Simplex (a triangle) containing origin when the two shapes are colliding. If collision is positive, I run EPA using the returned simplex for initializing polytope. When the EPA terminates successfully, it will give me collision normal and depth, which when combined would give me enough information to separate the two shapes.
But now I need to generate contact points. What suitable method would be best to use with GJK+EPA? in the past, I did it by identifying the closest feature of both shapes (most aligned "face" with collision normal), and clip them against each other. But it was when I was using SAT algorithm, and I used special data structure containing a shape's feature (Edge+Face List, mainly. It was 3D. Also it only supports box so far). But I'm looking for a simpler method now, since GJK+EPA are more generic than SAT, I lean more towards them. Also, I didn't store feature(face/edge) in the Shape data structure, only its vertex (in clockwise order, also they must be convex). Because the "Feature" are so diverse (in 3d, we can have triangle-face, quad-face, planar_polygon-face, even curved surface as a "face/feature" of spherical shape).
TL;DR;
So what is the most suitable method for generating contacts when one is already using GJK+EPA?
Below is some of my WIP

3d physics engine. Support box only so far. Using SAT for collision detection, and use some feature identification + clipping to generate contacts.
based of Box2D-lite (it's basically 3D version of Box2D-lite). Has contact caching, support warmstarting, also support stacking (the number can get
quite high depending on the simulation rate and the solver iteration). Stacked boxes wiggle around for a while before resting in peace forever.

2d implementation of GJK + EPA.
Red and White shapes : the shapes being tested for collision
Yellow triangle : Simplex returned by GJK
Red-Purplish shape : 2D Polytope generated by EPA
Green dot : origin
I didn't show the collision normal + depth, but it's there.