Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перерисовкой графики OpenGL, в контроле диалога на Win API 
V
    Опции темы
marcusmae
Дата 26.3.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Здравствуйте.

Допустим, у нас есть диалог, написанный средствами чистого Win API, а в нём находится контрол IDC_EDIT, в область которого направлен вывод последовательности функций OpenGL. Экран при запуске такой :

user posted image

Графика нормально выводится, перерисовывается при возвращении из трея, но при перетаскивании окна за границы области экрана и обратно наблюдается вот какой эффект :

user posted image

То есть при перетаскивании на области контрола остаются куски изображения по траектории перетаскивания и в дальнейшем не пропадают. Причём происходит это только если выводить окно за границу экрана и перетащить его оттуда с достаточно большой скоростью.

Почему это происходит? = Кто-нибудь, объясните, пожалуйста!

Вот некоторые коды :

Перерисовку делаю по WM_PAINT:
Код

        ...
        case WM_PAINT:
        hEdit=GetDlgItem(hDialog,IDC_EDIT);
        RefreshGL(hEdit);
        break;
        ...


Само рисование - через контекст устройства :
Код

DWORD WINAPI RefreshGL(HWND hDlg)
{
    HDC hDC; 
    HGLRC hglrc;

    hDC = GetDC(hDlg);
    hglrc = wglCreateContext(hDC);
      wglMakeCurrent(hDC, hglrc);
    
    // здесь грузится текстура :
      if (!loadTexture()) return FALSE;
    // здесь рисуется полигон :
      drawField();
        
    SwapBuffers(hDC);
    wglMakeCurrent(NULL, NULL); 
    ReleaseDC (hDlg, hDC) ; 
    wglDeleteContext(hglrc); 

    return TRUE;
}




--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
PRIZRAK001
Дата 26.3.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: 1
Всего: 1



Во-первых
Это обязательно каждый раз инициализировать, а затем деинициал-ть OpenGL при прорисовке контрола? Может стоить сделать это один раз: после создания окна и перед его уничтожением?

Во-вторых
Я не вижу функции очистки экрана glClear(...). Если ты не используешь какие-то свои методы очистки, то эту функцию надо писать перед прорисовкой.

Во-третьих
Деинициализация OpenGL осуществляется следующим образом
Код

if (hglrc)
   {
   wglMakeCurrent(hdc, 0);
   wglDeleteContext(hglrc);
   }
if (hdc)
   ReleaseDC(hwnd, hdc);

PM   Вверх
marcusmae
Дата 27.3.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



Действительно, оператор glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); в нужном месте полностью решил проблему. Спасибо большоеsmile
Под инициализацией & деинициализацией понимаются операции над контекстами в
DWORD WINAPI RefreshGL(HWND hDlg)? = Я правильно понял, что Вы предлагаете один раз создавать контексты при создании окна и один раз удалять при уничтожении окна?



--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
PRIZRAK001
Дата 27.3.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 13.7.2005

Репутация: 1
Всего: 1



Цитата(marcusmae @ 27.3.2006, 09:46 Найти цитируемый пост)
Под инициализацией & деинициализацией понимаются операции над контекстами в
DWORD WINAPI RefreshGL(HWND hDlg)?

Да.

Цитата(marcusmae @ 27.3.2006, 09:46 Найти цитируемый пост)
Я правильно понял, что Вы предлагаете один раз создавать контексты при создании окна и один раз удалять при уничтожении окна?

Верно. Но я немного ошибся. Не "окна", а "контрола". У тебя ведь графика выводится на контроле. Следовательно, после того как контрол создан - инициализируем OpenGL, перед тем как он будет удален - деинициализируем.

И ещё. Только сейчас заметил. Для меня странно, что у тебя инициализация проходит без установки формата пикселей smile (т.е. без вызова функций ChoosePixelFormat(...) и SetPixelFormat(...)).

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.