Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 14.04.2011, 17:51   #1
Invisible_
Пользователь
 
Регистрация: 21.11.2010
Адрес: Харьков
Сообщений: 14
Репутация: 10
По умолчанию Мерцание в OpenGL

Добрый день, у меня возникла проблема с OpenGL. Я пытаюсь рисовать прямоугольник, но почему-то происходит мерцание экрана при запуске программы. Вот код:


// мерцания.cpp: определяет точку входа для консольного приложения.
//


#include <gl\glut.h>

GLfloat spin=0.0;

void init(void)
{
glClearColor(0.0,0.0,0.5,0.0);
glShadeModel(GL_FLAT);
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

glRotatef(spin,0.0,0.0,1.0);

glColor3ub(255,255,255);
glBegin(GL_QUADS);
glVertex2f(-0.65f, -0.65f);
glVertex2f( 0.65f, -0.65f);
glVertex2f( 0.65f, 0.65f);
glVertex2f(-0.65f, 0.65f);
glEnd;

glPopMatrix();

glutSwapBuffers();
}

void spinDisplay(void)
{
spin=spin+1.0;
if(spin>360.0) spin=spin-360.0;
glutPostRedisplay();
}
void reshape(int w, int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
if (state==GLUT_DOWN) glutIdleFunc(spinDisplay); break;
case GLUT_RIGHT_BUTTON:
if (state==GLUT_DOWN) glutIdleFunc(0); break;
}
}

int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLU T_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Двойная буферизация");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}

В чем проблема и как ее решить?
Invisible_ вне форума   Ответить с цитированием
Старый 14.04.2011, 20:19   #2
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Адрес: Сибиряша
Сообщений: 131
Репутация: 45

icq: 619817361
По умолчанию

В принципе все нормально рисуется, но возможно фпс большой и «квад» слишком быстро крутиться отсюда мелькание... следует привязать расчеты поворота ко времени… к примеру так…
Код:
#include <Windows.h>
#include <gl\glut.h>

GLfloat spin=0.0;

int wait(int timer_id, unsigned int ms) 
{
  static unsigned int local_ms[10] = {0};

  if (local_ms[timer_id]<(GetTickCount())) {
    local_ms[timer_id]=(GetTickCount()+ms);
    return ( 1 );
  }
  else
    return ( 0 );
}

void init(void)
{
  glClearColor(0.0,0.0,0.5,0.0);
  glShadeModel(GL_FLAT);
}

void display()
{
  glClear(GL_COLOR_BUFFER_BIT); 

  glPushMatrix();

  glRotatef(spin,0.0,0.0,1.0);

  glColor3ub(255,255,255);
  glBegin(GL_QUADS); 
  glVertex2f(-0.65f, -0.65f); 
  glVertex2f( 0.65f, -0.65f); 
  glVertex2f( 0.65f, 0.65f); 
  glVertex2f(-0.65f, 0.65f); 
  glEnd();

  glPopMatrix();

  glutSwapBuffers();
}

void spinDisplay(void)
{
  //если у первого таймера не прошло 10ти мс выходим из ф-ии
  if (!wait(0, 10)) return; 
  spin=spin+1.0;
  if(spin>360.0) spin=spin-360.0;
  glutPostRedisplay();
}
void reshape(int w, int h)
{
  glViewport(0,0,(GLsizei) w, (GLsizei) h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

void mouse(int button,int state,int x,int y)
{
  switch(button)
  {
  case GLUT_LEFT_BUTTON:
    if (state==GLUT_DOWN) glutIdleFunc(spinDisplay); break;
  case GLUT_RIGHT_BUTTON: 
    if (state==GLUT_DOWN) glutIdleFunc(0); break;
  }
}

int main(int argc, char **argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode( GLUT_DOUBLE|GLUT_RGB);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(100,100);
  glutCreateWindow("Двойная буферизация");
  init();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutMouseFunc(mouse);
  glutMainLoop();
  return 0;
}
__________________
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума   Ответить с цитированием
Старый 14.04.2011, 21:05   #3
Invisible_
Пользователь
 
Регистрация: 21.11.2010
Адрес: Харьков
Сообщений: 14
Репутация: 10
По умолчанию

Спасибо, работает
Invisible_ вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мерцание ZBEP Общие вопросы Delphi 3 09.04.2011 15:14
Мерцание OpenGL saggy Мультимедиа в Delphi 13 02.07.2010 12:00
мерцание shad0w Общие вопросы C/C++ 3 11.12.2007 13:31


17:50.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.