Объекты растягиваются на весь экран - PullRequest
0 голосов
/ 30 декабря 2018

У меня проблема в том, что мои объекты растягиваются при использовании полного экрана.Я хочу, чтобы он соответствовал полноэкранным координатам, поэтому он выглядит точно так же, как изображение A. Я знаю, что glViewport определяет часть окна, к которой обращается OpenGL, и это может помочь установить мои объекты на все окно,Однако, я не использовал glViewport, вместо этого я использовал gluOrtho2D.

Нажмите здесь, чтобы увидеть полный код

Изображение A (Размер экрана: 700, 600)

Original screen size

Изображение B (полный экран)

Full screen size

код gluOrtho2D

// this is the initialisation function, called once only
void init() {
    glClearColor(0.0, 0.0, 0.0, 0.0); // set what colour you want the background to be
    glMatrixMode(GL_PROJECTION); // set the matrix mode
    gluOrtho2D(0.0, winWidth, 0.0, winHeight); // set the projection window size in x and y.
}

Я изначально использую gluOrtho2D, и он используется для настройки двумерногообласть просмотра орфографии.

1 Ответ

0 голосов
/ 30 декабря 2018

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);
    }
...