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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мерцание при изменение размеров окна, как правильно выводить графику OpenGL 
:(
    Опции темы
Paspartu
Дата 17.7.2010, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!

Как правильно выводить графику в окно (CView) MFC?
Начал изучать OpenGL… и уже начал ломать мозг …
В 2D есть двойная буферизация (GDI)… а тут…
в общем делаю так:

Код

void COpenGLDrawer::Draw(const CRect& rcViewport)
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очистим экpан и буфеp глубины
    glLoadIdentity (); //очистим текущую матpицу - матpицу объектов

    // какая-либо отрисовка
    
    glFlush();
    SwapBuffers(wglGetCurrentDC());  //поpа менять местами тот буфеp, на котоpом мы pисовали, и тот, котоpый сейчас на экpане
}

void COpenGLDrawer::SetViewport(int x, int y, int width, int height)
{
    glViewport(x, y, width, height);  
}


в CTestOpenGLView::PreCreateWindow установил WS_CLIPCHILDREN | WS_CLIPSIBLINGS
в CTestOpenGLView::OnCreate настроил OpenGL 
короче говоря все по книжкам и примерам...

Код

void CTestOpenGLView::OnDraw(CDC* /*pDC*/)
{
    CRect clientRect;
    GetClientRect(&clientRect);
    m_pDrawer->Draw(clientRect); // отрисовка OpenGL
}

void CTestOpenGLView::OnSize(UINT nType, int cx, int cy)
{
    m_pDrawer->SetViewport(0, 0, cx, cy);
    CView::OnSize(nType, cx, cy);
}

BOOL CTestOpenGLView::OnEraseBkgnd(CDC* pDC)
{
    return FALSE;
}


а также...
Код

BOOL CTestOpenGLApp::OnIdle(LONG lCount)
{
    ((CTestOpenGLView*)((CMainFrame*)m_pMainWnd)->GetActiveView())->OnDraw(0);
    return CWinApp::OnIdle(lCount);
}


Если не использовать OnEraseBkgn - жуткое мерцание...
а если использовать, то иногда сцена не прорисовывается...

Когда и где делать прорисовку OpenGL? 
1. Необходимо ли ее делать при обработке CTestOpenGLView::OnSize?
2. Почему при использовании  OnEraseBkgn (запрет затирки фона) получаются портаки, хотя COpenGLDrawer::Draw(...) вызывается? +
он вызывается в CTestOpenGLApp::OnIdle по окончании сообщений, но сцена не прорисовывается (иногда)?
3. Возможна ли двойная буферизация? T.e. рисовать средствами OpenGL в совместимом контексте, а затем делать блитинг на окно? Или это изврат? 

Короче говоря какие есть нюансы при выводе графики OpenGL в CView?

 





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

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

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


 




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


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

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