Yes, you can use an off-axis projection matrix. This is what I use in my code (note: I shift the centre upwards, not left as you do in your example.)
void camera_setAspectRatio(float aspect, float zNear, float zFar, bool offaxis) { // create a projection matrix const float f = 1.0f / tanf(fovy_radians/2.0f); fovx_radians = 2.0f * atanf( aspect * tanf(fovy_radians/2.0f) ); float* mout = proj.data; mout[0] = f / aspect; mout[1] = 0.0f; mout[2] = 0.0f; mout[3] = 0.0f; mout[4] = 0.0f; mout[5] = f; mout[6] = 0.0f; mout[7] = 0.0f; mout[8] = 0.0f; mout[9] = offaxis ? -0.25f : 0.0f; // off axis projection! mout[10] = (zFar+zNear) / (zNear-zFar); mout[11] = -1.0f; mout[12] = 0.0f; mout[13] = 0.0f; mout[14] = 2 * zFar * zNear / (zNear-zFar); mout[15] = 0.0f; }
Stereo Projection screens (not head-mounted) tend to use Off-Axis projection matrices as well. Paul Bourke has a great write up on these projections.