Re[2]: OpenGL - тормоза
От: gunf  
Дата: 21.06.04 08:16
Оценка:
Рисую так:
Пишу ну C++ Builder 5.
Сделал (делаю) компоненту на основе TCustomPanel — с OpenGL.
Вот кусок кода (2 функции) — где я рисую на панели:
//---------------------------------------------------------------------------
void __fastcall TMyPanel::PanelIdle(TObject*, bool& done)
{
    done = false;
    Paint();
}
//---------------------------------------------------------------------------
void __fastcall TMyPanel::Paint(void)
{
  //TCustomPanel::Paint();
  if (FOnPaint)
     {
      HPALETTE OldPalette=NULL;

      if (Palette)
         {
          OldPalette=SelectPalette(DisplayDeviceContext,Palette,FALSE);
          if (RealizePalette(DisplayDeviceContext)==GDI_ERROR)
             {
              ShowMessage("RealizePalette:"+IntToStr(GetLastError()));
              return;
             }
        }

      if (wglMakeCurrent(DisplayDeviceContext,GLRenderingContext)==false)
         {
          ShowMessage("wglMakeCurrent:" + IntToStr(GetLastError()));
          return;
         }

      FOnPaint(this);

      if ((FSwapBuffers==Auto) && (DoubleBuffer))
            ::SwapBuffers(DisplayDeviceContext);

      if (OldPalette)
             wglMakeCurrent(NULL, NULL) ;
    }
 return;
}
//---------------------------------------------------------------------------

Функция PanelIdle — вызывается когда Application->OnIdle — простой. Делаю это для того, чтобы, например, при OnMouseWellDown (Up) — увеличивать масштаб и ets ...

В самой проге — использую компонент и гружу файл (текстовый с координатами~ 100 000 координат)
в событии OnPanelPaint вызываю glCallList в котором уже сформирована матрица с точками. Т.е.:
//---------------------------------------------------------------------------
void __fastcall TMain::PanelPaint(TObject *Sender)
{
        Panel->Clear();
        glCallList(List_Name);//ListName - список изображения
}
//---------------------------------------------------------------------------

А сам список формирую так:
        List_Name = glGenLists(1);
        glNewList(List_Name,GL_COMPILE);
        Panel->SetPenColor(clRed);//Цвет пена
        Panel->SetScreenColor(clWhite);//цвет фона
        Panel->Mesh(Mesh);//финкция отрисовки сети см. ниже
    glEndList();

//---------------------------------------------------------------------------
 void __fastcall TMyPanel::Mesh    (SURF matr)
{
     for (int i = 0; i<int(matr.size()); i++)
        {
         for (int j = 1; j<int(matr[i].size()); j++)
          {
         glBegin(GL_LINES);
         glVertex3d(matr[i][j-1].x,matr[i][j-1].y,matr[i][j-1].z);
         glVertex3d(matr[i][j].x,matr[i][j].y,matr[i][j].z);
         glEnd();
          }
        }
}
//---------------------------------------------------------------------------



Вот в принципе и все.
Но 99 % проца — не есть весело
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.