Я использую этот код для рисования текста в openGL с помощью GLUT:
Код (часть инициализации), который устанавливает мое происхождение (0,0) в верхний левый угол и поддерживает правильную систему координации на основе разрешения экрана:
glViewport(0, 0, x, y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, x, y, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
Код (печатная часть):
void drawtext(GLfloat x, GLfloat y, const char* string )
{
glRasterPos2f(x,y);
while ( *string != '\0' )
glutBitmapCharacter(p_glutfont,static_cast<int>(*string++));
}
И все было бы прекрасно, если бы не только тот факт, что когда X и Y начинаются с отрицательных координат (из-за того, что объекты с напечатанным в виде тега текстом частично выходят за пределы поля зрения, то весь текст не рисуется. представим что у меня есть объект с текстовым тегом поверх него, и он входит в вид из левого верхнего угла в точке x = -40, y = 40:
X axis window
axis Y ----------------------------
| y=40 |
x=-40__|_________ |
|Text to print| |
|_____________| |
| |
| |
|____________________________|
Текст не печатается до тех пор, пока он не будет нарисован точно из координаты X => 0. Также этой проблемы не существует, когда текст должен быть обрезан с ПРАВОЙ стороны - тогда он печатается правильно - здесь я понял, что это связано с начальным положением текста.
Мой вопрос: как я могу правильно РАСШИРИТЬ отображение окна просмотра/экрана на:
1) сохранить координацию экрана от верхнего левого угла (0,0) до нижнего правого угла (высота, ширина) 2) с внутренним расширением этих значений только во время печати текста - чтобы текст обрезался, а не исчезал?
Хотя я провел свое исследование, я не мог в течение 2 дней прийти к какому-либо решению. Я пытался поиграть с glViewport и glOrtho, но ни одно из изменений и подходов, которые я пробовал (например, установка glViewport на -x,-y,x*2,y*2), не помогло - они всегда портят мою систему координации экрана. что важно для сохранения разрешения окна.
PS: я провел дополнительные исследования и наткнулся на эту статью http://www.opengl.org/archives/resources/faq/technical/clipping.htm.
10.070 Как нарисовать примитивы glBitmap() или glDrawPixels(), у которых начальный glRasterPos() находится за пределами левого или нижнего края окна?
Когда положение растра установлено за пределами окна, оно часто находится за пределами объема просмотра и впоследствии помечается как недопустимое. Рендеринг примитивов glBitmap и glDrawPixels не будет происходить с недопустимой позицией растра. Поскольку glBitmap/glDrawPixels создают пиксели вверх и вправо от положения растра, кажется невозможным визуализировать этот тип примитива, обрезанного левым и/или нижним краями окна.
Однако есть часто используемый прием: задайте для положения растра допустимое значение внутри объема просмотра. Затем сделайте следующий вызов:
glBitmap (0, 0, 0, 0, xMove, yMove, NULL);
Это говорит OpenGL отображать неактивное растровое изображение, но перемещать текущую растровую позицию на (xMove,yMove). Ваше приложение будет предоставлять значения (xMove,yMove), которые помещают положение растра за пределы объема просмотра. Следуйте этому вызову с помощью glBitmap() или glDrawPixels(), чтобы выполнить желаемый рендеринг.
К сожалению, я не могу применить этот совет в работе, а когда я его использую, текст полностью отсутствует.