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.