GlFlush () ничего не показывает

Мой OpenGL glFlush () ничего не показывал, когда я запускал проект перенасыщения в кодовых блоках в 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 ()?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
289
2

Ответы 2

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

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

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

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

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

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

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

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

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

Другие вопросы по теме