Olisiko jollain tietoa, mikä on vikana. Teksturoinnissa mättää jokin, sillä neliö, joka piirretään, on valkoinen, eikä teksturoitu. Tätä tutkiskeltiin #ohjelmointiputka:lla jo kauan, mutta ongelmaa ei keksitty.
main.cpp:
#include <SDL/SDL.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h> #include <SDL/SDL_image.h> #include <stdio.h> #include <iostream> using namespace std; #define RES_X 800 #define RES_Y 600 //glPiste palle; int MouseX_int, MouseY_int, MouseY_old, MouseX_old; GLfloat MouseX, MouseY; GLuint texture[1]; #include "systeemit.h" int main(int argc, char *argv[]) { #include "muuttujat.h" if (LoadTexture("palle.jpg", texture[0])!=0) return 1; SDL_Event event; float theta = 0.0f; SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(RES_X, RES_Y, 0, SDL_OPENGL | SDL_HWSURFACE | SDL_DOUBLEBUF); glViewport(0, 0, RES_X, RES_Y); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0); glDepthFunc(GL_LESS); glEnable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glLightfv(GL_LIGHT1, GL_AMBIENT, AmbientValo); glLightfv(GL_LIGHT1, GL_DIFFUSE, DiffuseValo); glLightfv(GL_LIGHT1, GL_POSITION, paikka); glEnable(GL_LIGHT1); glEnable(GL_COLOR_MATERIAL); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); gluPerspective(45.0f, (GLfloat)RES_X / (GLfloat)RES_Y, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); bool done; while (!done) { SDL_GetMouseState(&MouseX_int, &MouseY_int); MouseX = ((2.0f / (GLfloat)RES_X) * (GLfloat)MouseX_int) - 1.0f; MouseY = ((2.0f / (GLfloat)RES_Y) * (GLfloat)MouseY_int) - 1.0f; MouseY = -MouseY; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -2.0f); glRotatef(theta, 1.0f, 1.0f, 1.0f); glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); glTexCoord2f(-1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.0f); glTexCoord2f(-1.0f, -1.0f); glVertex3f(-0.5f, -0.5f, 0.0f); glTexCoord2f(1.0f, -1.0f); glVertex3f(0.5f, -0.5f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.0f); glEnd(); theta += 1.0f; SDL_GL_SwapBuffers(); int arvo; arvo = SDL_PollEvent(&event); if(event.key.keysym.sym == SDLK_ESCAPE || event.type == SDL_QUIT) done = true; /*if (arvo == 1) { if (event.key.keysym.sym == SDLK_LEFT) { } } else { }*/ SDL_Delay(1); } SDL_Quit(); return(0); }
systeemit.h:
/*struct glPiste { GLfloat x; GLfloat y; GLfloat z; };*/ //glPiste kuutio[23]; GLfloat AmbientValo[] = {0.5f, 0.4f, 0.6f, 0.5f}; GLfloat DiffuseValo[] = {0.9f, 0.7f, 0.9f, 0.5f}; GLfloat paikka[] = {0.0f, 2.0f, 5.5f, 0.5f}; int LoadTexture(const char *filename, GLuint &index) { SDL_Surface *tekstuurikuva; tekstuurikuva = NULL; glGenTextures(1, &index); tekstuurikuva = IMG_Load(filename); if (tekstuurikuva != NULL) { glBindTexture(GL_TEXTURE_2D, index); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); gluBuild2DMipmaps(GL_TEXTURE_2D, tekstuurikuva->format->BytesPerPixel, tekstuurikuva->w, tekstuurikuva->h, tekstuurikuva->format->BytesPerPixel==4?GL_RGBA:GL_RGB, GL_UNSIGNED_BYTE, tekstuurikuva->pixels); glTexImage2D(GL_TEXTURE_2D, 0, 3, tekstuurikuva->w, tekstuurikuva->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tekstuurikuva->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); return 0; } SDL_FreeSurface(tekstuurikuva); return 1; }
muuttujat.h:ssa ei ole mitään kovin erikoista.
palle.png on samassa kansiossa exen kanssa.
1) Toivottavasti kuitenkin palle.jpg (eikä palle.png), kun sellaista yrität tuolla ladata.
2) Myös glTexImage2D:hen tuo ehto, jolla valitaan RGB tai RGBA, ja Bpp-parametriin vastaavasti.
3) Luulen, että kannattaisi ensin laittaa glTexParameteri:t, sitten glTexImage2D, ja lopuksi vasta mipmapit.
4) Onko ihan harkitusti ja vaikutukset tietäen laitettu -1.0 koordinaatteihin?
1: Joo tuossa oli typo, mutta se ei periaatteessa haitannut, koska kansiossa oli myös palle.jpg (sama kuva).
2: Lisäsin, ei vaikuttanut.
3: Muutin näin, mutta ei vaikuttanut.
4: Ei ole harkitusti, eikä vaikutuksia tietäen :) Joku ajatuskatko sattunut. Korjasin nämä muotoon:
glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f); glEnd();
Ei vaikuttanut :(
Ratkaisu selvisi: SDL:n alustusfunktiot pitää siirtää ohjelman ensimmäisille riveille ja ladata tekstuuri vasta sitten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.