Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка картинок в потоке и вывод в OpenGL

289
04 февраля 2014 года
Jeyson
207 / / 20.04.2000
Здравствуйте уважаемые знатоки.
Пишу на C++Builder под OpenGL.
Необходимо чтобы изображения (их не мало) в потоке грузились в массив текстур, а после загрузки выводились на экран.
Если все грузить в OnPaint() и там же рисовать - проблем нет, просто тормоза при загрузке текстур. Разделяю в поток - белые прямоугольники (собственно говоря на которые и натягиваются текстуры образуя единое изображение). Т.е. проще говоря будет нечто наподобие Google планета земля: на максимальном отдалении одна картинка общая, ближе - 4 картинки, еще ближе - еще больше картинок склеенных в одну все лучшего и лучшего качества.
Вот некоторые фрагменты:

Это фрагмент функции Draw(), которая вызывается из OnPaint()
Код:
// определение перспективы, фонового цвета, освещения и т.д....
glViewport.....
glClearColor....
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
        glOrtho...
        gluLookAt.....

glPushMatrix();
//рисуем прямоугольники
            for (...)  /// по строкам
            {

                for (...) // по столбцам
                {

                  glColor3f(1.0,1.0,1.0);
                  glEnable(GL_TEXTURE_2D);
                  glBindTexture(GL_TEXTURE_2D, texture1[indexIm]);
                  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

                  // тут разные мои переменные, которые вычисляются в функции PokazKartin(), представленной ниже.
                  // все вычисляется корректно. Цель - показать как "натягиваю" текстуру на прямоугольники.

                          glBegin(GL_QUADS);
                                  glTexCoord2f(0.0f, 0.0f); glVertex3f(koordImageX+ImageW*(i-1), koordImageY-(NumRow1*ImageH),  -10);
                                  glTexCoord2f(1.0f, 0.0f); glVertex3f((ImageW+koordImageX+ImageW*(i-1)), (koordImageY-(NumRow1*ImageH)),  -10);
                                  glTexCoord2f(1.0f, 1.0f); glVertex3f((ImageW+koordImageX+ImageW*(i-1)), (ImageH+koordImageY)-(NumRow1*ImageH),  -10);
                                  glTexCoord2f(0.0f, 1.0f); glVertex3f(koordImageX+ImageW*(i-1), (ImageH+koordImageY-(NumRow1*ImageH)),  -10);
                          glEnd();

                         indexIm++;
                }
                koordImageY=koordImageY-ImageH;
                indexIm=indexIm+(countImageX-NumCol2)+NumCol1-1;
            }
// далее вызов других функций рисования
        glPopMatrix();
        SwapBuffers(ghDC);
Фрагмент функции PokazKartin();

Код:
// разные вычисления.....
            for (int j=NumCol1;j<=NumCol2;j++)
            {
               for(int i=j+countImageX*(NumRow1-1);i<=countImage-countImageX*(countImageY-NumRow2);i+=countImageX)
               {

                 if(texture1[i-1]==0)
                 {
                    loadKart(STR+AnsiString(i-1)+".bmp",i-1); // вызов функции загрузки текстур
                 }
               }

            }
//...разные вычисления....
Функция LoadKart в полном объеме (выдрал в Интернете)

Код:
void loadKart(AnsiString FailKart,int NumImage)
{

        char ppp[256];
        strcpy(ppp,FailKart.Trim().c_str());

    int Status=FALSE;                        
   
        AUX_RGBImageRec *TextureImage[102400];      

    memset(TextureImage,0,sizeof(void *)*1);
   
    if (TextureImage[NumImage]=LoadBMP(ppp))
    {
        Status=TRUE;      
        glGenTextures(1, &texture1[NumImage]);    

   
    glBindTexture(GL_TEXTURE_2D, texture1[NumImage]);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[NumImage]->sizeX, TextureImage[NumImage]->sizeY,
    GL_RGB, GL_UNSIGNED_BYTE,TextureImage[NumImage]->data);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
       }

     if (TextureImage[NumImage])          
     {
      if (TextureImage[NumImage]->data)  
      {
       free(TextureImage[NumImage]->data);
      }
      free(TextureImage[NumImage]);      
     }
 //}
}
Наконец самое главное!
Создал в отдельном Юните поток

 
Код:
void __fastcall MyThreadImage::Execute()
{
    FreeOnTerminate = true;
    PokazKartin(); // вызов функции
    Form1->Repaint();
}
При отпускании колеса мыши хочу его запустить

 
Код:
MyThreadImage *Thr = new MyThreadImage(true);
        Thr->Priority = tpNormal;
        Thr->Resume();
И вроде запускается, но вижу я только белый квадрат. Т.е. текстуры не загружаются.
Если же функцию PokazKartin() запускать в Draw(), которая постоянно вызывается для перерисовки, то все работает.
Такое впечатление, что поток отстает от загрузки текстур.
Прошу помощи. Спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог