Warsztat.GD

Programowanie => Szkółka => Wątek zaczęty przez: BugsBunny w Czerwiec 15, 2009, 19:40:16

Tytuł: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: BugsBunny w 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
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Krzysiek K. w 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. :)
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Avaj w Czerwiec 15, 2009, 20:04:16
Jak fixedfunc to jeszcze lektura glEnable(GL_TEXTURE_2D)/glDisable(GL_TEXTURE_2D) się przyda.
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Krzysiek K. w Czerwiec 15, 2009, 20:08:58
Jak fixedfunc to jeszcze lektura glEnable(GL_TEXTURE_2D)/glDisable(GL_TEXTURE_2D) się przyda.
To akurat jest.
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: .:NOXY:. w 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
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: BugsBunny w 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); 
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: RedHot w Czerwiec 15, 2009, 22:52:07
Wygląda mi to na brak glEnable(GL_DEPTH_TEST);
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Avaj w Czerwiec 15, 2009, 23:10:14
albo raczej (patrząc na kod), niepotrzebne glDisable(GL_DEPTH_TEST);

usuń to
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: BugsBunny w 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ć ?
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Krzysiek K. w 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ą.
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: BugsBunny w 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
Tytuł: Odp: [OpenGl] przełączanie tekstur w skyBox
Wiadomość wysłana przez: Majtek w 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ą