Задать вопрос
mrjbom
@mrjbom

OpenGL не сразу отображает данные из кадрового буфера?

Имеется программа которая обрисовывает 500 точек в случайных местах.
Проблема в том, что изображение обновляется только в моменты нажатия на него мышью и в промежутки в 1(или чуть меньше) секунду.
Как сделать так, что-бы изображение изменялось само и без задержки?

Вот она:
#include <iostream>
#include <conio.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctime>

using namespace std;

void init();
void displayFunction();

void init()
{
	glutDisplayFunc(displayFunction);
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-300, 300, -300, 300);
}

void displayFunction()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0, 0, 0);
	glPointSize(3.0);

	glBegin(GL_POINTS);
	srand((unsigned)time(NULL));
	//генерация точек и их отрисовка
	for (unsigned int i = 0; i < 500; ++i)
	{
		bool sign = bool(rand() % 2);
		int x = 0 + rand() % 301;
		int y = 0 + rand() % 301;
		if (!sign)
			x = -x;
		sign = bool(rand() % 2);
		if (!sign)
			y = -y;
		glVertex2i(x, y);
	}
	glEnd();
	glutSwapBuffers();
	glFlush();
}

int main(int argc, char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(600, 600);
	glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - 600) / 2, (GetSystemMetrics(SM_CYSCREEN) - 600) / 2);
	glutCreateWindow("Window");
	init();
	glutMainLoop();
	return 0;
}


Кстати, скажите, нужен ли тут glFlush()?
  • Вопрос задан
  • 234 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Я не вижу в твоем коде вызова glutIdleFunc. В документации написано что GLUT будет постоянно вызывать переданную функцию в свободное от обработки системных сообщений время. А если в glutIdleFunc передан nullptr (или idle-функция не была задана), то GLUT будет строго ждать следующего системного сообщения.

Если я все правильно помню, то передача настоящей функции, в которой будет вызываться функция glutPostRedisplay, в glutIdleFunc приведет и к регулярной перерисовке экрана.
Как правило, в качестве idle-функции в GLUT передают update-функцию, в которой обновляется состояние объектов перед рендерингом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы