Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL_Surface -> openGL-tekstuuri

KoodiNoppa [10.10.2007 22:34:25]

#

Pitäisi saada SDL_Surface muutettua openGL-tekstuuriksi. Se vaan jostain syystä kaatuu ennen kuin ehtii kunnolla alkamaankaan. Koodia ongelmakohdalta:

EDIT: löytyy tuosta alhaalta.

Tämän jälkeen kummallekaan kuvalle ei tehdä yhtään mitään. 24-bittisiä 128*128 .bmp ja .png tiedostoja olen kokeillut. Sisällytettyksessä kokeiltu opengl+sdl+lisäkirjastoja, opengl+sdl ja sdl+sdl_opengl. Muuten koodi on devpakin mukainen. Pistän vielä mainin tähän, kaikilla kun ei ole devpakkia.

int main(int argc, char *argv[]){
  SDL_Event event;
  float theta = 0.0f;
  SDL_Init(SDL_INIT_VIDEO);
  SDL_SetVideoMode(800, 600, 0, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);
  glViewport(0, 0, 800, 600);
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  glClearDepth(1.0);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_SMOOTH);
  glMatrixMode(GL_PROJECTION);
  glMatrixMode(GL_MODELVIEW);
  GLuint texture1;
  SDL_Surface *kuva;
  glGenTextures(1, &texture1);
  glBindTexture(GL_TEXTURE_2D, texture1);
  kuva = SDL_LoadBMP("TestSquare2.bmp");
  MySDL_glTexImage2D(kuva);
  SDL_FreeSurface(kuva);
  int done;
  for(done = 0; !done;){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f,0.0f,0.0f);
    //glRotatef(theta, 0.0f, 0.0f, 1.0f);
    SDL_GL_SwapBuffers();
    SDL_PollEvent(&event);
    if(event.key.keysym.sym == SDLK_ESCAPE)
      done = 1;
  }
  SDL_Quit();
  return(0);
}

Mikä koodissa on vialla?

User137 [11.10.2007 16:42:43]

#

Toimiiko kuitenkin jos jätät tekstuurikoodit pois?

KoodiNoppa [11.10.2007 21:41:44]

#

Toimii. Pelkkä Metabolixin funktion kutsun pois jättäminen riittää. Muillakin netistä etsityillä funktioilla kaatuu.

Metabolix [11.10.2007 22:06:28]

#

Tarkistapa, saatko kuvan edes ladattua. Muistaakseni olet (tai joku muu on) ennenkin täällä mokaillut tuollaisen kanssa. Saisi kehittyä ihan omaksi rutiiniksi, että osaisi tarkistaa tuollaiset perusasiat.

if (!kuva) {
    printf("Lataus meni pieleen!\n");
    abort();
}

Edit. Lisäsin pienen virheenkäsittelyohjeen koodivinkkiin. En jaksa moneen kertaan samoja pulmia ratkoa.

KoodiNoppa [11.10.2007 23:20:59]

#

Nyt hävettää, en laittanut polkuun kansiota, jossa kuva on. Tällä hetkellä tekstuuri on täyttä valkoista, vaikka pitäisi olla sellainen kirjava kuva.

glBindTexture(GL_TEXTURE_2D, texture1);
glBegin(GL_TRIANGLES);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 0.5f);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(0.5f, 0.0f);
glEnd();

Tuollaiset on ennen puskurien vaihtoa.

EDIT: texture1:n pitäisi olla kunnossa saman testin perusteella.

Metabolix [11.10.2007 23:50:23]

#

glEnable(GL_TEXTURE_2D);

Suosittelen jonkin oppaan hyödyntämistä.

KoodiNoppa [12.10.2007 16:54:29]

#

Kokeilin tuollakin. Ei toimi.

Vastaus

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

Tietoa sivustosta