I think what you need is to find the colsest point on the spherical triangle to a plane.
Then you can test against frustum planes for culling and the sphere for self occlusion.
For the self occlusion, Randys answer assumes orthographic projection, this leads to large error if we ar close to the sphere.
To take perspective into account, we can use the solid angle of the sphere:
vec ray = (sphereCenter - camera).Unit();
float dist = ray.Length();
float solidAngle = asin (sphereRadius / dist);
From that, we can get a circle on the sphere, everything behind the plane of this circle is occluded by the sphere:
vec circlePosition = ray * cos(solidAngle) * cos(solidAngle) * dist;
vec circleNormal = ray;
float circleRadius = sin(solidAngle) * cos(solidAngle) * dist; // don't need this
Now, my vague idea for colsest point spherical triangle to plane:
First, calculate the closest point of the sphere to the plane.
Calculate 3 planes for each arc edge (by its 2 vertices and sphere center - the arc is guaranteed to lie on the plane, yes?)
Classify the closest sphere point by checking in front or back of each plane.
If it is inside all three, the point is already in the triangle, so we can do the final plane test by the closest point and the 3 vertices.
If not, the point is outside and need to move it closest to the triangle.
With a planar triangle, you could easily detect on the classification result, if the point belongs to a vertex or edge region.
If in edge region, find closest point on edge and we're done. I assume projecting this back to sphere is accurate and no closest point on arc is necessary.
I think th entire method works on the sphere too, but there may be special cases when point is on the other side of the sphere than the triangle - my imagination end's here
But it should be easy to figere out during developement.