glViewport
определяет область (по умолчанию) кадрового буфера, который отображается.
Если вы не хотите выполнять рендеринг на весь экран, то вы можете уменьшить область рендеринга на glViewport
.Вы можете оставить несколько черных полос на границах.
Соотношение сторон для вашего приложения составляет winWidth
: winHeight
с glutGet
, используя параметрыGLUT_WINDOW_WIDTH
соответственно GLUT_WINDOW_HEIGHT
можно получить размер текущего окна и рассчитать текущее соотношение сторон:
int currWidth = glutGet( GLUT_WINDOW_WIDTH );
int currHeight = glutGet( GLUT_WINDOW_HEIGHT );
float window_aspcet = (float)currWidth / (float)currHeight;
С этой информацией представление может быть идеально отцентрировано к окну просмотра:
void display() {
float app_aspcet = (float)winWidth / (float)winHeight;
int currWidth = glutGet( GLUT_WINDOW_WIDTH );
int currHeight = glutGet( GLUT_WINDOW_HEIGHT );
float window_aspcet = (float)currWidth / (float)currHeight;
if ( window_aspcet > app_aspcet )
{
int width = (int)((float)currWidth * app_aspcet / window_aspcet + 0.5f);
glViewport((currWidth - width) / 2, 0, width, currHeight);
}
else
{
int height = (int)((float)currHeight * window_aspcet / app_aspcet + 0.5f);
glViewport(0, (currHeight - height) / 2, currWidth, height);
}
// [...]
}
Или вы можете определить соотношение сторон и центр ортографической проекции
void display() {
float app_aspcet = (float)winWidth / (float)winHeight;
int currWidth = glutGet( GLUT_WINDOW_WIDTH );
int currHeight = glutGet( GLUT_WINDOW_HEIGHT );
float window_aspcet = (float)currWidth / (float)currHeight;
glViewport(0, 0, currWidth, currHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if ( window_aspcet > app_aspcet )
{
float delta_width = (float)currWidth * (float)winHeight / (float)currHeight - (float)winWidth;
gluOrtho2D(-delta_width/2.0f, (float)winWidth + delta_width/2.0f, 0.0, (float)winHeight);
}
else
{
float delta_height = (float)currHeight * (float)winWidth / (float)currWidth - (float)winHeight;
gluOrtho2D(0.0, (float)winWidth, -delta_height/2.0f, (float)winHeight + delta_height/2.0f);
}