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.