I don't know anything about vertex shaders, so that's all black magic to me. I found a little demo on Nehe's website, here's the conversion:
[pascal]
{ .: GetCameraPosAndUp :. }
procedure GetCameraPosAndUp(var camPos, camUp: TAffineVector);
var
ViewMatrix: array[0..15] of Single;
M: TMatrix;
begin
glGetFloatv(GL_MODELVIEW_MATRIX, @ViewMatrix);

camPos := AffineVectorMake(-ViewMatrix[12], -ViewMatrix[13], -ViewMatrix[14]);
camUp := AffineVectorMake(ViewMatrix[1], ViewMatrix[5], ViewMatrix[9]);
ViewMatrix[12] := 0.0;
ViewMatrix[13] := 0.0;
ViewMatrix[14] := 0.0;
M := ConvertArrayToMatrix(ViewMatrix);
TransposeMatrix(M);

camPos := AffineVectorMake(VectorTransform(VectorMake(camPos ), M));
end;

{ .: CreateBillboardMatrix :. }
procedure CreateBillboardMatrix(var AMat: TMatrix; const ARight, AUp, ALook,
APos: TAffineVector);
begin
AMat[0][0] := ARight[0];
AMat[0][1] := ARight[1];
AMat[0][2] := ARight[2];
AMat[0][3] := 0.0;
AMat[1][0] := AUp[0];
AMat[1][1] := AUp[1];
AMat[1][2] := AUp[2];
AMat[1][3] := 0.0;
AMat[2][0] := ALook[0];
AMat[2][1] := ALook[1];
AMat[2][2] := ALook[2];
AMat[2][3] := 0.0;
// Add the translation in as well.
AMat[3][0] := APos[0];
AMat[3][1] := APos[1];
AMat[3][2] := APos[2];
AMat[3][3] := 1.0;
end;

{ .: BillboardAxis :. }
procedure BillboardAxis(const Pos, Axis, camPos: TAffineVector);
var
Look, Up, Right: TAffineVector;
begin
Look := VectorSubtract(camPos, Pos);
NormalizeVector(Look);

Up := Axis;
Right := VectorCrossProduct(Up, Look);
NormalizeVector(Right);

Look := VectorCrossProduct(Right, Up);

CreateBillboardMatrix(M, Right, Up, Look, Pos);
end;
[/pascal]
But this doesn't work either. Here are the screenshots - Screen #1, Screen #2.

Any more ideas?