Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с перерисовкой графики OpenGL


Автор: marcusmae 26.3.2006, 19:10
Здравствуйте.

Допустим, у нас есть диалог, написанный средствами чистого 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;
}


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

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

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

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

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

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

Да.

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)