Wczytywanie kilku tekstur w opengl

0

Witam
Jestem nowy więc nie wiem czy w dobrym dziale to umieściłem, jeśli nie to sory.
Mój problem polega na tym że:

Chcę zrobić funkcję w openGl która narysuje mi model segmentu który ma mieć nałożone 3 tekstury. Wczytuję te tekstury ale kiedy próbuję je nałożyć to niezależnie od wybranej nakłada mi wszędzie ostatnią wczytaną teksturę. To jest mój kod:

 
GLuint NazwyTekstur[3];

bool LoadBMPTexture(char * FileName) //ładowanie bmp
{
   GLvoid * obrazek,* zlyobrazek;
   BITMAPINFO * infoBitmapy;

   zlyobrazek = LoadDIBitmap(FileName, &infoBitmapy);
   if(zlyobrazek == NULL)
   {
    return false;//nie udalo sie
   }
   obrazek = ConvertRGB(infoBitmapy, zlyobrazek);
   free(zlyobrazek);
   if(obrazek == NULL)
   {
    free(infoBitmapy);
    return false;//nie udalo sie
   }

   gluBuild2DMipmaps(GL_TEXTURE_2D,
                GL_RGB, // internalFormat
   				 infoBitmapy->bmiHeader.biWidth,
                infoBitmapy->bmiHeader.biHeight,
                GL_RGB, // format
                GL_UNSIGNED_BYTE, // type
                obrazek);
   free(obrazek);
   free(infoBitmapy);
   return true;
}

void initTextures() //przypisanie tekstur
{
   glGenTextures(3, NazwyTekstur);


   glBindTexture(GL_TEXTURE_2D, NazwyTekstur[0]);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   LoadBMPTexture("Danger.bmp");

   glBindTexture(GL_TEXTURE_2D, NazwyTekstur[1]);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   LoadBMPTexture("slup2.bmp");

   glBindTexture(GL_TEXTURE_2D, NazwyTekstur[2]);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   LoadBMPTexture("podloga_slup.bmp");
}

void init(void)
{
   glClearColor (0.0, 0.0, 1.0, 0.0);
   glEnable(GL_DEPTH_TEST);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   initTextures();
   //glEnable(GL_TEXTURE_2D);
}

void PostawSegment(float S, float x, float y, float z) //moj segment
{
      float size=S/2;
      glPushMatrix();
      glTranslatef(x,y,z);

      glBegin(GL_QUADS);
            glBindTexture(GL_TEXTURE_2D, NazwyTekstur[0]);
           //glColor3f(0.5,0.5,0.5);
           glTexCoord2f(0.0, 0.0); glVertex3f(-size,0,size);
           glTexCoord2f(1.0, 0.0); glVertex3f(size,0,size);
           glTexCoord2f(1.0, 1.0); glVertex3f(size,0,-size);
           glTexCoord2f(0.0, 1.0); glVertex3f(-size,0,-size);
      glEnd();

      glBegin(GL_QUADS);
           //glColor3f(0,0,0.5);
           glBindTexture(GL_TEXTURE_2D, NazwyTekstur[1]);
           glTexCoord2f(0.0, 0.0); glVertex3f(-size,-size*0.4,size);
           glTexCoord2f(1.0, 0.0); glVertex3f(-size,0,size);
           glTexCoord2f(1.0, 4.0); glVertex3f(-size,-0,-size);
           glTexCoord2f(0.0, 4.0); glVertex3f(-size,-size*0.4,-size);
      glEnd();
      //... itd rysowanie kolejnych płaszczyzn
     glPopMatrix();
}

Podejrzewam że jest tu jakiś banalny błąd ale czy mógłby ktoś wskazać jak nałożyć konkretną teksturę z tablicy NazwyTekstur[3] ???

1

Sprawdzanie błędów OpenGL nie boli i potrafi uratować:

http://www.opengl.org/sdk/docs/man/xhtml/glBindTexture.xml

Errors
GL_INVALID_ENUM is generated if target is not one of the allowable
values.

        GL_INVALID_OPERATION is generated if texture was previously created with a target
        that doesn't match that of target.
    

GL_INVALID_OPERATION is generated if glBindTexture is executed
between the execution of glBegin and the corresponding
execution of glEnd.

czyli BindTexture musisz wyciągnąć spomiędzy begin i end.

0

Tezcatlipoca chłopie jak ja Ci dziękuję. Pomogło :D

0

Pozwolę sobie kontynuować wątek. Chciałbym zrobić kolejna rzecz ale nie mogę nigdzie podpowiedzi znaleźć. Chodzi o to że w inicie ustawia się ClearColor a ja chciałbym żeby zamiast koloru była jakaś tekstura. Czy da się to w ogóle zrobić?

0

Pozwolę sobie kontynuować wątek. Chciałbym zrobić kolejna rzecz ale nie mogę nigdzie podpowiedzi znaleźć. Chodzi o to że w inicie ustawia się ClearColor a ja chciałbym żeby zamiast koloru była jakaś tekstura. Czy da się to w ogóle zrobić?

Niestety nie, ale to dość proste do osiągnięcia. Na początku musisz po prostu wyłączyć depth testing i narysować quada na cały ekran (jeśli nie wykonasz wcześniej jakichś przekształceń macierzy modelview to quad ma wymiary od [-1, -1] do [1, 1]).
W pseudokodzie:

ClearWithTexture()
{
    disable(DEPTH_TESTING);
    drawQuad(-1, -1, 1, 1);
    enable(DEPTH_TESTING);
}

Można to jeszcze osiągnąć przez http://www.opengl.org/sdk/docs/man/xhtml/glDrawPixels.xml, ale nie polecałbym, niewiele prostsze rozwiązanie a będzie działać wolniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1