By oblique perspective, I assume you mean a case where it is not symmetric perspective but rather asymmetric perspective.
Simplest thing is to just use glFrustum() to cook this PROJECTION matrix and gluLookAt to cook your VIEWING matrix (or use work-alikes, in the now-common case where you aren’t using GL built in matrix math).
In WORLD-SPACE, define your eyepoint and near clip plane. Draw a vector from the eyepoint through and perpendicular to the near clip plane. This is your EYE-SPACE -Z axis. You can define your up-vector as well, and then (incidentally) you have enough to completely define your VIEWING transform – just call gluLookAt to get it.
Now back to that PROJECTION transform. Take that vector you drew from the eyepoint orthogonal to the near clip plane. Take the distance between the eyepoint and the point where it hits the near clip plane. That is your “near” distance for glFrustum(). Now look at the sides of your frustum and where they hit the near clip plane. Those provide your l,r,b,t values. Finally, just pick your “far” value and you’ve just finished collecting all the parameters to pass glFrustum() to build your projection matrix.
By oblique i mean, when you are not in front of a mirror, but on the side, look my image from my app, I use q3dm0 map to test the mirror and portal. see the images, you will understand when you compare both of them.
It’s just i need to transform my plane before using it, I did not find the right transformation to make my oblique work so far.