Autor Wątek: [OpenGl] przełączanie tekstur w skyBox  (Przeczytany 1192 razy)

Offline BugsBunny

  • Użytkownik

# Czerwiec 15, 2009, 19:40:16
Witam,

Mam problem z oteksturowaniem skyBoxa. Mianowicie wyświetla mi się taka sama tekstura na każdej ścianie.
tak wczytuję tekstury z plików TGA:
int hTex[6];
TGAImg *img[6];
GLuint tex[6];
std::string skyTex[6];

GLuint tex0;
GLuint tex1;


void loadTextures() {
for(int i = 0 ; i < 6 ; i++){
switch(i){
case 0: glActiveTexture(GL_TEXTURE0); break;
case 1: glActiveTexture(GL_TEXTURE1); break;
case 2: glActiveTexture(GL_TEXTURE2); break;
case 3: glActiveTexture(GL_TEXTURE3); break;
case 4: glActiveTexture(GL_TEXTURE4); break;
case 5: glActiveTexture(GL_TEXTURE5); break;
};
// glActiveTextureARB(GL_TEXTURE0_ARB);
img[i] = new TGAImg();
if (img[i]->Load(skyTex[i].c_str())==IMG_OK) {
glGenTextures(1,&tex[i]);             //Zainicjuj uchwyt tex
glBindTexture(GL_TEXTURE_2D,tex[i]); //Przetwarzaj uchwyt tex
if (img[i]->GetBPP()==24)              //Obrazek 24bit
glTexImage2D(GL_TEXTURE_2D,0,3,img[i]->GetWidth(),img[i]->GetHeight(),0,
GL_RGB,GL_UNSIGNED_BYTE,img[i]->GetImg());
else if (img[i]->GetBPP()==32)         //Obrazek 32bit
glTexImage2D(GL_TEXTURE_2D,0,4,img[i]->GetWidth(),img[i]->GetHeight(),0,
GL_RGBA,GL_UNSIGNED_BYTE,img[i]->GetImg());
else {

}
} else {

}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
}

}

a tak wyświetlam mojego cuba w przyszłości skyboxa.
// SKYBOX

glPushMatrix();
   
// Enable/Disable features
    glPushAttrib(GL_ENABLE_BIT);
    glEnable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glDisable(GL_BLEND);

glScaled(10,10,10);

    // Render the front quad

   

   glClientActiveTexture(GL_TEXTURE0);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the left quad
//glDisable(GL_TEXTURE_2D);
glClientActiveTexture(GL_TEXTURE1);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f(  0.5f,  0.5f,  0.5f );
    glEnd();

    // Render the back quad
    glClientActiveTexture(GL_TEXTURE2);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f,  0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f,  0.5f );

    glEnd();

    // Render the right quad
    glClientActiveTexture(GL_TEXTURE3);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f( -0.5f,  0.5f,  0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the top quad
    glClientActiveTexture(GL_TEXTURE4);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
        glTexCoord2f(0, 0); glVertex3f( -0.5f,  0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f,  0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f,  0.5f, -0.5f );
    glEnd();

    // Render the bottom quad
    glClientActiveTexture(GL_TEXTURE5);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
    glEnd();
    glPopAttrib();
    glPopMatrix();

Byłym wdzięczny za wskazówki bo męcze się z tym już od dłuższego czasu.

pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 15, 2009, 20:01:01
Cytuj
Byłym wdzięczny za wskazówki bo męcze się z tym już od dłuższego czasu.
Jedyne co mogę zrobić, to odesłać do dokumentacji i polecić uważne przestudiowanie co właściwie robią glActiveTexture, glClientActiveTexture i glBindTexture oraz jak poprawnie przełączać się między teksturami. Z Twojego kodu widać kompletne niezrozumienie działania tych funkcji. :)

Offline Avaj

  • Użytkownik

# Czerwiec 15, 2009, 20:04:16
Jak fixedfunc to jeszcze lektura glEnable(GL_TEXTURE_2D)/glDisable(GL_TEXTURE_2D) się przyda.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 15, 2009, 20:08:58
Jak fixedfunc to jeszcze lektura glEnable(GL_TEXTURE_2D)/glDisable(GL_TEXTURE_2D) się przyda.
To akurat jest.

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Czerwiec 15, 2009, 20:09:51
i ew glBindTexture(GL_TEXURE2D, ID); czyli tam u ciebie tex[0 - 5] ;] musi działac :> ja tak robilem kiedys ale polecam probowac boxa renderowac cubemapa w shaderze choc to drudniejsze ale imo szybciej chodzi o ile sie uzywa VBO

Offline BugsBunny

  • Użytkownik

# Czerwiec 15, 2009, 22:30:26
poprawiłem całe teksturowanie jednak mam dwa problemy.

Mianowicie jedna ze ścian tutaj tex[5] jest tak jakby z jednej strony zawsze na wierzchu. Widać na obrazku w załączniku


No i ściany są oteksturowane tylko z jednej strony. Tzn jak wejde do cuba jest czarne lub jak narysyje tylko jednego face widze teksture z jednej strony.

tutaj kod wyświetalania tej tekstury która jest zwsze na wierzchu

    // Render the right quad
    glBindTexture(GL_TEXTURE_2D,tex[1]);
glEnable(GL_TEXTURE_2D);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(1, 0); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f( -0.5f,  0.5f,  0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f,  0.5f, -0.5f );
    glEnd();
glDisable(GL_TEXTURE_2D);
    // Render the top quad
   
    // Render the bottom quad   TA JEST ZAWSZE NA WIERZCHU
    glBindTexture(GL_TEXTURE_2D,tex[4]);
glEnable(GL_TEXTURE_2D);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -0.5f, -0.5f, -0.5f );
        glTexCoord2f(0, 1); glVertex3f( -0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 1); glVertex3f(  0.5f, -0.5f,  0.5f );
        glTexCoord2f(1, 0); glVertex3f(  0.5f, -0.5f, -0.5f );
    glEnd();
glDisable(GL_TEXTURE_2D); 

Offline RedHot

  • Użytkownik

# Czerwiec 15, 2009, 22:52:07
Wygląda mi to na brak glEnable(GL_DEPTH_TEST);

Offline Avaj

  • Użytkownik

# Czerwiec 15, 2009, 23:10:14
albo raczej (patrząc na kod), niepotrzebne glDisable(GL_DEPTH_TEST);

usuń to

Offline BugsBunny

  • Użytkownik

# Czerwiec 15, 2009, 23:26:45
Zostawiłem sobie tylko dwie ściany do wyświetlenia no i są oteksturowane tylko od zewnątrz z drugiej strony wszystko jest czarne. Jak to zmienić ?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 15, 2009, 23:29:32
Zostawiłem sobie tylko dwie ściany do wyświetlenia no i są oteksturowane tylko od zewnątrz z drugiej strony wszystko jest czarne. Jak to zmienić ?
Odwrócić kolejność wierzchołków, to i ściany się odwrócą.

Offline BugsBunny

  • Użytkownik

# Czerwiec 16, 2009, 01:12:44
odwrócenie wierzchołków pomogło.

CO do samego skyboxa, to teraz przeskalować przez jakas duza liczbe poprostui umiescic tam gdzie kamera? Co zrobić zęby nie było widać kształu sześcianu bo czasem widać łączenia ścian

Offline Majtek

  • Użytkownik

# Czerwiec 16, 2009, 16:35:11
ustaw GL_CLAMP_TO_EDGE dla textur i będzie dobrze
a kamerę ustaw w środku skyboksa  i przesuwaj go razem z kamerą
« Ostatnia zmiana: Czerwiec 16, 2009, 16:38:08 wysłana przez Majtek »