Это должно быть определено довольно легко. Размер шрифта в пикселях зависит только от преобразования вида модели (фактически только от масштабируемой части), преобразования проекции (я полагаю, простой ортогональной проекции) и настроек области просмотра, и, конечно же, от размера отдельного символа шрифт в нетрансформированной форме (что входит в glVertex
вызовы).
Таким образом, вы просто берете базовый размер шрифта (давайте рассмотрим только высоту и назовем его height
) и сначала выполните преобразование вида модели (предполагая, что масштабирование, показанное в коде, является единственным):
height *= scaleFactor;
Далее мы делаем преобразование проекции:
height /= (top-bottom);
с top
и bottom
являются значениями, которые вы использовали при указании ортографического преобразования (например, с использованием glOrtho
). И последнее, но не менее важное: мы делаем преобразование области просмотра:
height *= viewportHeight;
с viewportHeight
, как вы уже догадались, высотой области просмотра, указанной в вызове glViewport
. В результате height
должен быть высотой вашего шрифта в пикселях. Вы можете использовать это, чтобы как-то масштабировать ширину линии (без if), так как параметр ширины линии в любом случае находится в числах с плавающей запятой, пусть OpenGL выполняет дискретизацию.
Если ваш конвейер преобразования более сложный, вы можете использовать более общий подход с использованием полных матриц преобразования, возможно, с помощью gluProject для преобразования точки пространства объекта в точку пространства экрана:
double x0, x1, y0, y1, z;
double modelview[16], projection[16];
int viewport[4];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
gluProject(0.0, 0.0, 0.0, modelview, projection, viewport, &x0, &y0, &z);
gluProject(fontWidth, fontHeight, 0.0, modelview, projection, viewport, &x1, &y1, &z);
x1 -= x0;
y1 -= y0;
fontScreenSize = sqrt(x1*x1 + y1*y1);
Здесь я взял диагональ символа, а не только высоту, чтобы лучше игнорировать повороты, и мы использовали источник в качестве исходного значения для игнорирования переводов.
Вы также можете найти ответы на этот вопрос интересными, которые дают некоторое представление о конвейере преобразования OpenGL.