If your aim is just to fill the region and since you say you're using opengl, an alternative to Nathan's suggestion of using a triangulation algorithm++, is to use the stencil buffer.
Assuming you want odd/even fill, clear the stencil buffer, dice up your polygon as before but have your triangles just (IIRC) invert the stencil. When all are sent, draw again but only where the stencil is non-zero. (It's been a while but I think you can clear the stencil buffer at the same time as this second pass to save time on the next complex polygon.)
The stencil buffer approach should also work with self-intersecting polygons.
One final thing, I think it is more fill-efficient if you use a triangle strip rather than a fan when you chop up your polygon. You just need to access your vertices in something like 0, 1, N-1, 2, N-2 etc. order
More information on the stencil buffer can be found in OpenGL Stencil Tests and in Drawing Filled, Concave Polygons Using the Stencil Buffer
++ Though, if you do want to use a triangulation algorithm but have a very large number of vertices, you could try Seidel's method as it's 'relatively' easy to implement but has nearly O(n) time complexity.
However if you do a search for Seidel, note that the code in Narkhede &
Manocha is not actually Seidel's method as theirs is only O(n log n) not the faster O(n log* n) you should expect, where, if you're not familiar with it,
$$log^*n =\begin{cases}
1+ log^*(log(n)) & \text{if $n$ > 1} \\
0 & \text{otherwise}
\end{cases}$$
In practical terms, you can consider it to be constant as it grows so slowly.