Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL tekstuuriongelma

hyrppa95 [18.09.2011 15:24:48]

#

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;
}

Pekka Karjalainen [18.09.2011 17:26:46]

#

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...

User137 [18.09.2011 19:48:36]

#

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, ....);

hyrppa95 [19.09.2011 17:42:17]

#

Kiitos, User137. Nyt toimii.

Vastaus

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

Tietoa sivustosta