Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL&OpenGL textuurinlatausongelma

InvalidCo [17.03.2007 09:40:51]

#

Koodasin tällaista OpenGL&SDL-härpäkettä. Jostain kumman syystä kyseinen koodi ei toimi, näytölle ei ilmaannu mitään. Kokeilin sekä BMP että PNG-kuvamuodoilla, ei toiminut. :/

Toivottavasti joku osaavampi keksii mikä tässä on vikana...

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_opengl.h>

int windowW=320, windowH=240;

GLuint loadTexture(char *filename) {
    SDL_Surface *pic;
    GLuint readypic;
    pic=IMG_Load(filename);
    if(pic){
        glGenTextures(1, &readypic);
        glBindTexture(GL_TEXTURE_2D, readypic);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, pic->w, pic->h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic->pixels);
        SDL_FreeSurface(pic);
        return readypic;
    } else {
        return NULL;
    }
}

int main ( int argc, char** argv )
{
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
        printf( "Couldn't initialize SDL: %s\n", SDL_GetError() );
        return 1;
    }
    atexit(SDL_Quit);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    if(!SDL_SetVideoMode(windowW, windowH, 16, SDL_OPENGL)) {
        printf("Couldn't set videomode: %s\n", SDL_GetError());
        return 1;
    }
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glViewport(0, 0, windowW, windowH);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, windowW, windowH, 0.0f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    GLuint textuuri;
    textuuri=loadTexture("maa.bmp");
    bool done = false;
    while (!done)
    {
       SDL_Event event;
       while (SDL_PollEvent(&event))
       {
            switch (event.type) {
                case SDL_QUIT:
                    done = true;
                    break;
            }
       }
       glBindTexture(GL_TEXTURE_2D, textuuri);
       glBegin(GL_QUADS);
		// Front Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);	// Top Right Of The Texture and Quad
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);	// Top Left Of The Texture and Quad
		// Back Face
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad
		// Top Face
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
		// Bottom Face
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Top Right Of The Texture and Quad
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Top Left Of The Texture and Quad
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
		// Right face
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);	// Top Right Of The Texture and Quad
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);	// Top Left Of The Texture and Quad
		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);	// Bottom Left Of The Texture and Quad
		// Left Face
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad
		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);	// Bottom Right Of The Texture and Quad
		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);	// Top Right Of The Texture and Quad
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);	// Top Left Of The Texture and Quad
	glEnd();
       SDL_GL_SwapBuffers();
    }
    return 0;
}

(Mod. Edit. Välejä pitkille koodiriveille!)

Pöytälamppu [18.03.2007 12:08:11]

#

Onko sinulla jossain glEnable(GL_TEXTURE_2D) ?

Edit. Tutkiskelin & testailin koodia ja havatisin:
* Et koskaan tyhjennä aiemmin piirtämääsi (käytä glClear(GL_COLOR_BUFFER_BIT) ennen piirtoa (Tosin tässä tapauksessa turha, koska kuva ei muutu mitenkään piirtokerroilla))
* Luot koordinaatiston 0..windowW X 0..windowH tuossa glOrtho-kohdassa, ja sitten piirrät 2 yksikköä leveän neliön kohtaan (0,0) eli vasempaan ylänurkkaan. Korvaa se glOrtho(-windowW/2,windowW/2,-windowH/2,windowH/2, -1.0f, 1.0f), jolloin kohta (0,0) on keskellä. HUOM! Tämä, jos piirrät 2D juttuja
* Jos yrität luoda 3D kuutiota niin:

//Jonnekkin ennen looppia
glDisable(GL_CULL_FACE); //Pinnat näkyy kummaltakin puolelta
glEnable(GL_DEPTH_TEST); //Estää taaempana olevan kappaleen piirtymisen lähemmän päälle
glEnable(GL_TEXTURE_2D); //Enabloi tekstuurit

//ORTHON PAIKALLE
gluPerspective (45.0f, float(windowW)/windowH,1.0f, 20.f);

//Looppiin ennen piirtoa
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); //Tyhjennetään väri- ja syvyyspuskuri

glLoadIdentity(); //Nollataan matriisimuunnokset
glTranslatef(0,0,-5); //Siirretään kuutio kameran eteen
glRotatef(kulma,0,1,0); //Pyöritetään kuutiota Y-akselin ympäri
kulma+=0.1f;

Aseta float kulma globaaliksi, niin pitäiasi toimia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta