// определение перспективы, фонового цвета, освещения и т.д....
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);
Загрузка картинок в потоке и вывод в OpenGL
Пишу на C++Builder под OpenGL.
Необходимо чтобы изображения (их не мало) в потоке грузились в массив текстур, а после загрузки выводились на экран.
Если все грузить в OnPaint() и там же рисовать - проблем нет, просто тормоза при загрузке текстур. Разделяю в поток - белые прямоугольники (собственно говоря на которые и натягиваются текстуры образуя единое изображение). Т.е. проще говоря будет нечто наподобие Google планета земля: на максимальном отдалении одна картинка общая, ближе - 4 картинки, еще ближе - еще больше картинок склеенных в одну все лучшего и лучшего качества.
Вот некоторые фрагменты:
Это фрагмент функции Draw(), которая вызывается из OnPaint()
Код:
Код:
// разные вычисления.....
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); // вызов функции загрузки текстур
}
}
}
//...разные вычисления....
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); // вызов функции загрузки текстур
}
}
}
//...разные вычисления....
Код:
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]);
}
//}
}
{
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();
}
{
FreeOnTerminate = true;
PokazKartin(); // вызов функции
Form1->Repaint();
}
Код:
MyThreadImage *Thr = new MyThreadImage(true);
Thr->Priority = tpNormal;
Thr->Resume();
Thr->Priority = tpNormal;
Thr->Resume();
Если же функцию PokazKartin() запускать в Draw(), которая постоянно вызывается для перерисовки, то все работает.
Такое впечатление, что поток отстает от загрузки текстур.
Прошу помощи. Спасибо.