ПрограммированиеФорумГрафика

Текстуры по Краснову

Страницы: 1 2 Следующая »
#0
14:51, 12 дек 2009

Загружаю текстуру по книжке Краснова "OpenGL в проектах Delphi".

AssignFile(F,'test.bmp');
  Reset(F,1);
  BlockRead(F,FileHdr,SizeOf(TBITMAPFILEHEADER));
  BlockRead(F,InfoHdr,SizeOf(TBITMAPINFOHEADER));
  Header := InfoHdr;
  ArraySize := FileSize(F)-SizeOf(TBITMAPFILEHEADER)-SizeOf(TBITMAPINFOHEADER);
  GetMem(p,ArraySize);
  BlockRead(F,p^,ArraySize);
  for i := 0 to InfoHdr.biWidth*InfoHdr.biHeight-1 do
  begin
    b := TByteArray(p^)[i].R;
    TByteArray(p^)[i].R := TByteArray(p^)[i].B;
    TByteArray(p^)[i].B := b;
  end;
  CloseFile(F);

Нечто подобное. Проверяю, в массиве растр есть. При применении процедуры glDrawPixels растр выводится корректно. Строю прямоугольник.

glEnable(GL_TEXTURE_2D);
             glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
             glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
             glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
             wglMakeCurrent(WinDC,WinHRC);

             glColor3f(0.7,0.6,0);
             glBegin(GL_TRIANGLES);
             glTexCoord2f(0,0);
             glVertex2f(-0.5,-0.5);
             glTexCoord2f(0,1);
             glVertex2f(-0.5,0.5);
             glTexCoord2f(1,1);
             glVertex2f(0.5,0.5);


             glTexCoord2f(0,0);
             glVertex3f(-0.5,-0.5,0);
             glTexCoord2f(1,1);
             glVertex3f(0.5,0.5,0);
             glTexCoord2f(1,0);
             glVertex3f(0.5,-0.5,0);
             glEnd;
             glDisable(GL_TEXTURE_2D);

             SwapBuffers(WinDC);
             wglMakeCurrent(0,0);

Получаю прямоугольник с цветом, установленным в glColor3f. Никакой текстуры. Что бы это могло быть?

#1
14:58, 12 дек 2009

может wglMakeCurrent(WinDC,WinHRC); в самое начало всё-таки поставить ? а то текстура неизвестно в каком контексте энейблится...

#2
15:02, 12 дек 2009

Ставил. Результат - EAcsessViolation.

#3
15:04, 12 дек 2009

А где glBindTexture?

#4
15:18, 12 дек 2009

glBindTexture - это разве не при работе с текстурными списками вызывается?

#5
15:18, 12 дек 2009

Black Phoenix
Там не надо, у него же одна текстура.

#6
15:20, 12 дек 2009

Vinil
> а то текстура неизвестно в каком контексте энейблится...
Почему неизвестно, известно - в нулевом :).
DimaO
А почему у тебя РГБА? Вроде битмап загружаешь.

#7
15:26, 12 дек 2009

Я ставил и GL_RGB. Результат один - не рисуется текстура и все. Битмап 24-битный RGB.

#8
15:27, 12 дек 2009

ExeLord
> Вроде битмап загружаешь.
Он альфу поддерживает.

> Битмап 24-битный RGB.
Сделяй 32 битный.

#9
15:43, 12 дек 2009

> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Плохая запись. Правильней:
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Обращаю внимание на цифру 3 - это число компонентов в текстуре.

#10
15:47, 12 дек 2009

Какой-то злобный метод загрузки текстур. Попробуй так:

unsigned GLTextureManager::LoadBMPTexture(char *texName)
{

    if(AUX_RGBImageRec * temp_tex = auxDIBImageLoad ( texName ))
    {
      unsigned      textureId;

      glGenTextures   ( 1, &textureId );
      glBindTexture   ( GL_TEXTURE_2D, textureId );
      glPixelStorei   ( GL_UNPACK_ALIGNMENT, 1 );              // set 1-byte alignment

      glTexParameteri ( GL_TEXTURE_2D,  GL_TEXTURE_WRAP_S, GL_REPEAT );  // set texture to repeat mode
      glTexParameteri ( GL_TEXTURE_2D,  GL_TEXTURE_WRAP_T, GL_REPEAT );

      gluBuild2DMipmaps ( GL_TEXTURE_2D, GL_RGB, 
                temp_tex -> sizeX, temp_tex -> sizeY, 
                GL_RGB, GL_UNSIGNED_BYTE, 
                temp_tex -> data );      

      glTexParameteri   ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
      glTexParameteri   ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );

      return textureId;
    }
    else
    {
      cout<<texName<<" can not be found"<<endl;
      return -1;
    }
}

//Init
colors_texture = texManager.LoadTexture("1.bmp");

...
//Render
glActiveTextureARB (GL_TEXTURE1_ARB);
glBindTexture      (GL_TEXTURE_2D, colors_texture);

*отрисовка треугольников

#11
15:48, 12 дек 2009

Voltt
> Плохая запись.
Ничем не плохая.

> Правильней: glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptr);
Чем правильней?

#12
16:02, 12 дек 2009

NULL_PTR
> Чем правильней?
Тем, что GL_RGBA задаёт около 4к компонентов ^_^
Vel
Если простой имадж не подходить, то мипмапы точно работать не будут.

#13
16:06, 12 дек 2009

DimaO
Так, на всякий случай. Ты glTexImage2D не каждый кадр вызываешь?

#14
16:06, 12 дек 2009

Интересно. Сделал четырехкомпонентный массив, все отображается. Тогда почему не отображается трехкомпонентный?

Dimich

Пока только по одиночному событию. Когда разберусь с загрузкой, поменяю.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.