glFlush () ничего не показывает - PullRequest
0 голосов
/ 03 мая 2018

Мой OpenGL glFlush () ничего не показывал, когда я запускал проект перенасыщения в Codeblocks на windows 7. Вот моя основная функция.

#include <windows.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>

float Color1=0.0, Color2=0.0, Color3=0.0;
int r,p,q;


void keyboard(unsigned char key, int x, int y)
{
  switch (key)
  {
  case 27:             // ESCAPE key
      exit (0);
      break;

  case 'r':
     Color1=1.0, Color2=0.0, Color3=0.0;
     break;
  case 'g':
     Color1=0.0, Color2=1.0, Color3=0.0;
     break;
  case 'b':
      Color1=0.0, Color2=0.0, Color3=1.0;
      break;
  }
  glutPostRedisplay();

}

void Init(int w, int h)
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glViewport(0,0, (GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D( (GLdouble)w/-2,(GLdouble)w/2, (GLdouble)h/-2, (GLdouble)h/2);

}

static void display(void)
{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    int i=0;
    glColor4f(0,0,0,1);
    glPointSize(1);
    glBegin(GL_POINTS);
    for( i=-320;i<=320;i++)
        glVertex2f(i,0);
    for( i=-240;i<=240;i++)
        glVertex2f(0,i);
    glEnd();

    glColor4f(Color1,Color2, Color3,1);
    glPointSize(1);
    glBegin(GL_POINTS);
    int x=0, y = r;
    int d= 1-r;
    while(y>=x)
    {
        glVertex2f(x+p, y+q);
        glVertex2f(y+p, x+q);
        glVertex2f(-1*y+p, x+q);
        glVertex2f(-1*x+p, y+q);

        glVertex2f(-1*x+p, -1*y+q);
        glVertex2f(-1*y+p, -1*x+q);
        glVertex2f(y+p, -1*x+q);
        glVertex2f(x+p, -1*y+q);

        if(d<0)
            d += 2*x + 3;
        else
        {
            d += 2*(x-y) + 5;
            y--;
        }
        x++;
    }

    glEnd();
    glFlush();
    //glutSwapBuffers();
}


int main(int argc, char *argv[])
{

    printf("Enter the center point and radius: ");
    scanf("%d %d %d",&p,&q,&r);
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

    glutCreateWindow("Circle drawing");

    Init(640, 480);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(display);


    glutMainLoop();

    return 0;
}

Но когда я изменяю эти две строки, это просто отлично работает.

glFlush (); для glutSwapBuffers (); а также glutInitDisplayMode (GLUT_RGB | GLUT_SINGLE); в glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

Может кто-нибудь сказать мне, в чем проблема с моим кодом и почему не работает glFlush ()?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

glFlush работает как задокументировано :

The glFlush function forces execution of OpenGL functions in finite time.

Что он делает, так это заставляет все ожидающие операции OpenGL завершать рендеринг в обратный буфер . Это не будет магически отображать задний буфер. Для этого вам нужно поменять буфер шрифтов и задний буфер.

Таким образом, правильное использование glFlush в сочетании с glutSwapBuffers. Но это избыточно, так как glutSwapBuffers будет сбрасывать все ожидающие операции рендеринга в любом случае.

Похоже, что вы используете старый учебник OpenGL 1.1, где двойная буферизация была дорогой новинкой. В настоящее время двойная буферизация является нормой, и вам нужно прыгнуть через довольно дорогие обручи, чтобы получить одиночную буферизацию.

Поскольку OpenGL в настоящее время имеет версию 4.6, я бы посоветовал вам хотя бы начать использовать 4.0.

0 голосов
/ 03 мая 2018

Современные графические системы (Windows DWM / Aero, MacOS Quartz Extreme, X11 Composite) построены вокруг концепции композиция . Композиция всегда подразумевает двойную буферизацию и, следовательно, полагается на замену буфера для запуска обновления композиции.

Вы можете отключить DWM / Aero в Windows и запретить использование оконного менеджера компоновки в X11, и тогда OpenGL с одиночным буфером должен работать как положено.

Но почему именно вы хотите рисовать с одной буферизацией? Современные графические процессоры фактически предполагают, что двойная буферизация используется для эффективной прокачки конвейера представления. Нет нужды в том, чтобы быть в одиночной буферизации.

...