Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 15:20   #1
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
Печаль Мерцание OpenGL

О, великие мозги форумчанинов! Помогите начинающему опенджиэлцу, но не новичку в делфи. Проблема вот в чём: захотел я научиться строить и двигать объекты в OpenGL. Построил я два куба путём два раза по шесть glbegin(GL_QUAD). Да вот только когда кубы друг друга перекрывают (не пересекают), начинается мерцание на них. Бегают полоски. Я сделал обычный дельфинский таймер на 41 мсек, по которому вызываю onpaint. Doublebuffered вообще оставляет любоваться только на чёрный фон. Код нужен? Или так подскажете? Что делать то...
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Старый 29.06.2010, 17:07   #2
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

SwapBuffers(dc) в конце функции отрисовки вызываешь ?
Develop вне форума Ответить с цитированием
Старый 29.06.2010, 18:24   #3
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

Вот весь код обработки onpaint:
Код:
wglMakeCurrent(Canvas.Handle, hrc);
glViewport(0, 0, ClientWidth, ClientHeight);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу
glTranslatef (0.0, 0.0, -8.0); // перенос объекта - ось Z
glRotatef (r1, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef (70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect(Handle, nil, False);
glcolor3f(0.6,0.0,0.0);

glEnable (GL_LIGHTING); // разрешаем работу с освещенностью
glEnable(GL_LIGHT0); // включаем источник света 0
glEnable(GL_LIGHT1); // включаем источник света 1

drawcube(1,0,0); // моя функция создания куба из 6 квадратов
                  glcolor3f(0.0,0.4,0.0);
drawcube(-1.5,0,0);

glPopMatrix;
SwapBuffers (Canvas.Handle);
wglMakeCurrent (0, 0) ;
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Старый 29.06.2010, 19:37   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Не очень понятно, что за полоски. Если такие

то это Z-fighting.
Somebody вне форума Ответить с цитированием
Старый 29.06.2010, 20:39   #5
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Код:
InvalidateRect(Handle, nil, False);
что эта фунция делает в OnPaint ?
она как раз вызывает запуск OnPaint.

и это
Код:
glPopMatrix;
где glPushMatrix ?
Перед тем как извлекать что-то из стека матриц (glPopMatrix),
нужно сначала туда что-то положить (glPushMatrix).
Develop вне форума Ответить с цитированием
Старый 29.06.2010, 22:37   #6
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

ну я функции opengl почти не знаю, я ток первый день учу его
InvalidateRect(Handle, nil, False); и glPopMatrix; убрал. мерцание на перекрытиях исчезло. зы: Somebody, это не Z-fighting, который появляется на пересечении объектов в одной плоскости. я же говорил, кубы не пересекаются. но остались где то в секунду интервалом проблёскивающиеся горизонтальные полосы на всей области прорисовки. ну оч хотелось бы узнать как от них избавиться. скорее всего что то не дописал. заскринить полосы не могу, слишком уж редко появляются. теперь код таков:
Код:
wglMakeCurrent(Canvas.Handle, hrc);
glViewport(0, 0, ClientWidth, ClientHeight);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу
// этот фрагмент нужен для придания трехмерности
glTranslatef (0.0, 0.0, -8.0); // перенос объекта - ось Z
glRotatef (0, 1, 0, 0.0); // поворот объекта - ось X
glRotatef (r1, 0.0, 1.0, 0.0); // поворот объекта - ось Y

glcolor3f(0.6,0.0,0.0);

glEnable (GL_LIGHTING); // разрешаем работу с освещенностью
glEnable(GL_LIGHT0); // включаем источник света
glEnable(GL_LIGHT1); // включаем источник света

drawq(0,0,0);
                  glcolor3f(0.0,0.4,0.0);
drawq(1,1.5,1.5);

SwapBuffers (Canvas.Handle);
wglMakeCurrent (0, 0) ;
и запуск обработчика:

Код:
procedure TfrmGL.Timer1Timer(Sender: TObject);
begin
refresh;
formpaint(nil);
end;
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.
saggy вне форума Ответить с цитированием
Старый 29.06.2010, 22:55   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

можете показать как инициировали GL может там что?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.06.2010, 23:46   #8
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

сделай так
Код:
procedure TfrmGL.Timer1Timer(Sender: TObject);
begin
  InvalidateRect(Handle, nil, False); //или Canvas.Handle (вобщем Handle формы на которой рисуешь)
end;
и добавь

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

после

glViewport(0, 0, ClientWidth, ClientHeight);

Последний раз редактировалось Develop; 29.06.2010 в 23:49.
Develop вне форума Ответить с цитированием
Старый 30.06.2010, 13:52   #9
saggy
Форумчанин
 
Регистрация: 08.10.2009
Сообщений: 112
По умолчанию

Develop, скорее всего в это и дело. Проверю позже, пока 3d не очень требуется. Убрав refresh из таймера и используя 2d никакого мерцания не возникает. Спасибо. Теперь новая проблема http://programmersforum.ru/showthrea...582#post566582

эээ...ошибся...возникает. Develop, сделал всё как ты сказал. мерцание на прямоугольнике. теперь только реже.
вот вам то, чем я оперирую. зы: это изменённый исходник от учебника.
Вложения
Тип файла: rar Архив WinRAR.rar (173.5 Кб, 21 просмотров)
procedure life; for years := 1 to 11 do gotoschool(normal); woman := TMan.add; childrens.add(TMans); problems.add(fuck); woman.destroy; END.

Последний раз редактировалось saggy; 30.06.2010 в 14:17.
saggy вне форума Ответить с цитированием
Старый 01.07.2010, 09:23   #10
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Код не смотрел, но там может быть другая проблема.
У тебя картинка перерисовывается каждые 41 мсек, это 24,4 кадра в сек.
Может не совпадать с частотой обновления экрана.
Включи вертикальную синхронизацию или поменяй интервал на таймере.

Последний раз редактировалось mihali4; 19.11.2010 в 19:52.
Develop вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мерцание Image Жека-старший Компоненты Delphi 4 23.05.2010 19:36
Мерцание vladi Microsoft Office Excel 0 03.06.2009 17:42
Мерцание на Канве SERG1980 Мультимедиа в Delphi 3 30.04.2008 08:14
мерцание shad0w Общие вопросы C/C++ 3 11.12.2007 12:31