Olen tekemässä SDL:llä ja OpenGL:llä peliä, mutta kun piirrän kuvan se pikselöityy. Voisiko joku kertoa mikä on vikana?
Kuvankaappaus
http://hyrppa95.webs.com/screenshot.png
Lähdekoodi:
#include "SDL.h" #include "SDL_image.h" #include "SDL_opengl.h" GLuint loadTexture(const char* path); SDL_Surface *screen; int main(int argc, char** argv) { SDL_Init(SDL_INIT_EVERYTHING); //Set OpenGL memory usage SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); screen = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL); SDL_WM_SetCaption("OpenGL Test", NULL); //Specific the clear color glClearColor(1,1,1,1); //RED,GREEN,BLUE,ALPHA //What portion of the screen we will display glViewport(0, 0, 800, 600); //Shader model - Use this glShadeModel(GL_SMOOTH); //2D rendering glMatrixMode(GL_PROJECTION); //"Save" it glLoadIdentity(); //Disable depth checking glDisable(GL_DEPTH_TEST); //We enable blending of textures and set how we are going to blend it glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); SDL_Event event; int closeGame = 0; //background texture GLuint background = 0; background = loadTexture("C:\\Users\\Matias\\Desktop\\gPower2D\\gPower2D\\gPower2D\\Data\\Images\\background.png"); while(!closeGame) { while(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) closeGame = 1; } //start rendering glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); //Start rendering phase glOrtho(0, 800, 600, 0,-1,1); //Set the matrix glColor4ub(255, 255, 255, 255); //White color glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, background); glBegin(GL_QUADS); glTexCoord2d(0,0); glVertex2f(0, 0); //Upper-left corner glTexCoord2d(1,0); glVertex2f(800, 0); //Upper-right corner glTexCoord2d(1,1); glVertex2f(800, 600); //Down-right corner glTexCoord2d(0,1); glVertex2f(0, 600); //Down-left corner glEnd(); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); glPopMatrix(); SDL_GL_SwapBuffers(); } SDL_Quit(); return 0; } GLuint loadTexture(const char* path) { SDL_Surface* surface = IMG_Load(path); GLuint texture; glPixelStorei(GL_UNPACK_ALIGNMENT,4); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); SDL_PixelFormat *format = surface->format; if (format->Amask) { gluBuild2DMipmaps(GL_TEXTURE_2D, 4, surface->w, surface->h, GL_RGBA,GL_UNSIGNED_BYTE, surface->pixels); } else { gluBuild2DMipmaps(GL_TEXTURE_2D, 3, surface->w, surface->h, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels); } SDL_FreeSurface(surface); return texture; }
OpenGL-wikin Common Mistakes sivu kertoo, ettei gluBuild2DMipMaps-proseduuria tulisi käyttää. He eivät kerro miksi, joten en minäkään osaa tähään hätään sanoa muuta.
http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation
Sen sijaan wikissä annettu esimerkkikoodi tuotti minulla ihan selvän ja pikselöimättömän kuvan (kuvakaappaus, jossa oli tekstiä ja mistä pikselöinnin kyllä erottaisi helposti). Käytin koodia "Legacy Generation" otsikon alta, joka vaatii siis vain OpenGL 1.4:n. (Tässä koneessani on vain 2.1:een asti tuki.)
Luepa vielä tarkasti eri ratkaisujen tuesta OpenGL:n eri versioiden kanssa, niin ei tule sitten myöhemmin ongelmia...
Tekstuuri pikselöityy koska et missään vaiheessa aseta linear filtteriä päälle glTexParameteri:llä.
Mipmapeilla jotenkin tähän tapaan:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps(GL_TEXTURE_2D, ....);
Kiitos, User137. Nyt toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.