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!)
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.