Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL ja teksturointi

Meitsi [09.12.2005 18:49:54]

#

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.

Metabolix [09.12.2005 19:04:44]

#

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?

Meitsi [09.12.2005 19:16:21]

#

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 :(

Metabolix [09.12.2005 19:42:29]

#

Ratkaisu selvisi: SDL:n alustusfunktiot pitää siirtää ohjelman ensimmäisille riveille ja ladata tekstuuri vasta sitten.

Vastaus

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

Tietoa sivustosta