Я бы предложил более «прямой» подход к рисованию. Если вы можете рисовать градиент попиксельно, вам нужно просто запомнить, что для
- круг градиент цвета пропорционален
r
- эллипс (овал) градиент цвета пропорционален
r1+r2
Здесь:
r - расстояние до центра круга
r1, r2 - расстояния до двух фокусов эллипса
EDIT:
Рассмотрим этот код пиксельного шейдера:
uniform sampler2D tex;
void main()
{
vec2 center = vec2(0.5,0.5);
float len = 1.3*(distance(gl_TexCoord[0].xy,center));
vec2 foc1 = vec2(len,0.);
vec2 foc2 = vec2(-len,0.);
float r = distance(center+foc1,gl_TexCoord[0].xy) +
distance(center+foc2,gl_TexCoord[0].xy);
float k = pow(r*0.9,1.3);
vec4 color = vec4(k,k,k,1.);
gl_FragColor = color;
}
Вы получите овал что-то вроде этого:

удачи