PDA

View Full Version : Texture Problem



pedrosl
07-02-2001, 06:37 AM
Hi,

I'm doing a project in OpenGL and i'm having some problems... I'm trying to implement a texture ("Textura.bmp") nd every time I run the program the texture doesn't appear..... why ??!! Please Help Me !! Here goes the code:

_____________________________________________

#include <windows.h>
#include <gl/glut.h>
//#include <Fstream.h> esta incluido em textura.h
#include <math.h>
#include "textura.h"


#ifndef M_PI
#define M_PI 3.14159265
#endif

#define heightMnt 450
#define lenghtYmnt 62
#define lenghtXmnt 62

#define stepXmnt 96.0
#define stepYmnt 96.0

#define WIDTH 640
#define HEIGHT 480
#define FOV 85


#define OBSSTARTX 300
#define OBSSTARTY 400
#define OBSSTARTZ 150


static char frbuf[80];
static float alpha=75.0;
static float beta=90.0;
static float teta=0.0;
static float v=0.0;
static int poutline=0;
static int joyavailable=0;
static int usetex=1;
static int help=1;
static int fog=1;
static int bfcull=1;
static int joyactive=0;
static float obs[3]={OBSSTARTX,OBSSTARTY,OBSSTARTZ};
static float dir[3],v1[2],v2[2];
static float eyex, eyey,eyez;
static float scale = 1.;

static int scrwidth=WIDTH;
static int scrheight=HEIGHT;

int is_depth;

//Chamada de X vector de pixeis
RGBpixmap pix[1];


//Controlo e cálculo da posição da câmera
static void calcposobs(void)
{

float alpha1,alpha2;

dir[0]=sin(alpha*M_PI/180.0);
dir[1]=cos(alpha*M_PI/180.0)*sin(beta*M_PI/180.0);
dir[2]=cos(beta*M_PI/180.0);

alpha1=alpha+FOV/2.0;
v1[0]=sin(alpha1*M_PI/180.0);
v1[1]=cos(alpha1*M_PI/180.0);

alpha2=alpha-FOV/2.0;
v2[0]=sin(alpha2*M_PI/180.0);
v2[1]=cos(alpha2*M_PI/180.0);

obs[0]+=v*dir[0];
obs[1]+=v*dir[1];
obs[2]+=v*dir[2];

//Controlo da câmera em torno do eixo dos ZZ (circulo)
//Para obter uma elipse com centro em ZZ acrescentar +100 ... em ambos os membros
teta+=1;
eyex=(400+v)*cos((alpha)*M_PI/180.0);
eyey=(400+v)*sin((alpha)*M_PI/180.0);
eyez=100+beta; //para manter somente dar uma constante


if(obs[1]<0.0)
obs[1]=0.0;
}

//Refresca a imagem a cada momento
static void reshape( int width, int height )
{
scrwidth=width;
scrheight=height;
glViewport(0, 0, (GLint)width, (GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(50.0, ((GLfloat) width/(GLfloat)height), lenghtXmnt*stepYmnt*0.01,
lenghtXmnt*stepYmnt*0.7);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

//Escreve uma string com o tipo de letra desejado- para ver o tipo de letras ver o file glut.h
static void printstring(void *font, char *string)
{
int len,i;
len=(int)strlen(string);
for(i=0;i<len;i++)
glutBitmapCharacter(font,string[i]);
}

//Escreve o texto inicial com tipo de letra desejado
static void printhelp(void)
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.3,0.3,0.3,0.0);
glRecti(40,40,600,440);
glDisable(GL_BLEND);

glColor3f(0.0,0.0,0.0);
glRasterPos2i(300,400);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"AJUDA");

glRasterPos2i(70,350);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"H - Ajuda (Ligar/Desligar)");
glRasterPos2i(70,300);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"S - Sair ");
glRasterPos2i(70,250);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"C - Chao (Ligar/Desligar)");
glRasterPos2i(70,200);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"A - Aproximar");
glRasterPos2i(70,150);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Z - Afastar");
glRasterPos2i(70,100);
printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Setas - Mudar camera");

}

//Inicializa o diplay de boiças e dispoe as texturas
void boicasInit(void){
glClearColor(0.4f,0.4f,1.0f,0.0f); //fundo azul
//glColor3f(0.0f,0.0f,0.0f);
//glPointSize(4.0);
//glLineWidth(2.0);

glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);

pix[0].readBMPFile("c:\\Telhado.bmp");
pix[0].setTexture(2001);

glViewport(0,0,640,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}


//Futuramente deverá ser o desenho do terreno
void drawTerrainBoicas(void)
{



}

//Constroi paredes com a largura e posição desejadas
void wall(double largura, double x, double y, double z)
{
glPushMatrix();
glTranslated(x, y, z);
glScaled(1.0, largura, 1.0);
glutSolidCube(50.0);
glPopMatrix();
}


int gl_define_forma(char gl_define[20])
{
if (strcmp("*GL_POINTS",gl_define) == 0)
return 0x0000;
if (strcmp("*GL_LINES",gl_define) == 0)
return 0x0001;
if (strcmp("*GL_TRIANGLES",gl_define) == 0)
return 0x0004;
if (strcmp("*GL_QUADS",gl_define) == 0)
return 0x0007;
if (strcmp("*GL_POLYGON",gl_define) == 0)
return 0x0009;

}




void drawPontosBoicas(char * fileName)
{


fstream inStream;
inStream.open(fileName, ios ::in);
if(inStream.fail())
return;
glClear(GL_COLOR_BUFFER_BIT);
GLdouble numpolys, numLines,r, g, b, x, y, z;
char n_des[100];
char gl_define[20];

inStream >> numpolys;
for(int j=0; j<numpolys; j++)
{

inStream >> n_des;
inStream >> gl_define;
inStream >> numLines;


glBegin(gl_define_forma(gl_define));
for (int i = 0; i<numLines; i++)
{
inStream >> r>> g>> b>> x >> y >> z;
glColor3f(r,g,b);
glVertex3d(x,y,z);
}
glEnd();
}




inStream.close();
}


//Desenho da casa - atenção às texturas
void drawCasaBoicas(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glRotated(90, 1,0,0);
glTranslated(50,50,200);
drawPontosBoicas("data_casa.geo");

/*
//Nebbbbbbboeêeeeiro
GLfloat FockColor[4]={1.0,1.0,1.0,1.0};
glEnable(GL_FOG);
glFogf(GL_FOG_DENSITY,0.0014);
glFogi(GL_FOG_MODE,GL_EXP2);
glFogfv(GL_FOG_COLOR,FockColor);


//Luzes
glEnable(GL_LIGHTING);

//Define
GLfloat ambientLight[] = {0.4f, 0.4f, 0.4f, 1.0f};
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat specular[] = {0.7f,0.7f,0.7f,1.0f};
GLfloat LightPos [] = {-707.0f, 707.0f,707.0f , 1.0f};
GLfloat specref[] = {0.6f,0.6f,0.6f,1.0f};

//Set up da Luz 0
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight );
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);

//Acende
glEnable(GL_LIGHT0);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);

glMaterialfv(GL_FRONT,GL_SPECULAR,specref);
glMateriali(GL_FRONT,GL_SHININESS,32);


*/







//////////////////////////////////////////////////////////
/*

glBegin(GL_POLYGON);
glColor3f(1.0,0.0,0.0);

glVertex3f(167.842,28,-193);
glVertex3f(75,54,-193);
glVertex3f(-18.374,28,-193);
glVertex3f(75,26,-193);
glEnd();
*/

// glTranslated(50,50,300);

// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glPushMatrix();


// Aplicação das texturas desejadas
glBindTexture(GL_TEXTURE_2D,2001);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // não distorce a imagem
glBegin(GL_QUADS);
glTexCoord2f(0.0,1.0); glVertex3f(75,-10.416,-193); // 6 (1,0,1)
glTexCoord2f(1.0,1.0); glVertex3f(75,-10.416,-293); // 7 (1,1,1)
glTexCoord2f(1.0,0.0); glVertex3f(137,-32.816,-293); // 2 (1,1,0)
glTexCoord2f(0.0,0.0); glVertex3f(137,-32.816,-193); // 1 (1,0,0)
glEnd();

//eixos coordenados para ajuda de orientação
//glTranslated(0,0,0);
/* glBegin(GL_LINES);
glColor3f(1, 0, 0);
glVertex3d(0,0,0);
glVertex3d(1000,0,0);
glVertex3d(0,0,0);
glVertex3d(0,0,1000);
glVertex3d(0,0,0);
glVertex3d(0,1000,0);
glEnd();
*/
/*glPushMatrix();
glColor3f(1,0,0.7);
glTranslated(50,50,200);
glutSolidSphere(30,30,30);
glPopMatrix();
*/

// wall(0.3, 30, 30, 30);
/* glPushMatrix();
glColor3f(1, 1, 0.7);
glTranslated(50, 50, 50);
glutSolidCube(100);
glPopMatrix();
*/

////////////////////////////////////////////////////////////



/*
glPushMatrix();
glTranslated(1.5,0,-193);
glRotated(90,1,0,0);
GLUquadricObj * qobj;
qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj,GLU_LINE);
gluCylinder(qobj,12.5,12.5,26,40,40);
glPopMatrix();

*/
glFlush();
// glPopMatrix();
// glutSwapBuffers(); // não sei o que é
}


//Comandos de visualização e chamada das funções para desenhar o terreno e a casa
void displayBoicas(void)
{
/* glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-200.0, 200.0, -200.0, 200.0, 400, -400);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

// gluLookAt(2 , 3, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DE CAL);

glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);

if(usetex)
glEnable(GL_TEXTURE_2D);
else
glDisable(GL_TEXTURE_2D);
/*
if(fog)
glEnable(GL_FOG);
else
glDisable(GL_FOG);
*/

// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

calcposobs();

/*gluLookAt(300,400,150,
0,0,0,
0.0,0.0,1.0); // vista sem rotações

/*gluLookAt(obs[0],obs[1],obs[2],
dir[0]*10,dir[1]*10,dir[2]*10,
0.0,0.0,1.0); // atenção que o view plane estava em Y e passou para z

gluLookAt(obs[0],obs[1],obs[2],
obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
0.0,0.0,1.0); // este é a melhor rotação mas primeiro tem de se recuar com z

gluLookAt(obs[0],obs[1],obs[2],
0,0,0,
0.0,0.0,1.0); // rotação em torno do lado esquerdo da casa - não se deve mexer nas arrow keys (só para outras persrpectivas) só em a e z
*/
gluLookAt(eyex,eyey,eyez,
-20,-20,-100,
0.0,0.0,1.0); // rotação em torno dos ZZ funciona com up e down key


/* gluLookAt(obs[0],obs[1],obs[2],
obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
0.0,0.0,1.0); // este é a melhor rotação mas primeiro tem de se recuar com z

glColor3d(0,0,0);

*/

/*
//Luzes
GLfloat mat_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat mat_diffuse[] = {0.6f, 0.6f, 0.6f, 1.0f};
GLfloat mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat mat_shininess[] = {50.0f};
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

GLfloat lightIntensity[] = {0.7f, 0.7f, 0.7f, 1.0f};
GLfloat light_position[] = {2.0f, 6.0f, 3.0f, 0.0f};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightIntensity);


GLfloat light_position[] = {200.0f,200.0f, 300.0f, 1.0f};
// glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
/////

*/

drawTerrainBoicas();
drawCasaBoicas();



glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glShadeModel(GL_FLAT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glColor3f(0.0,0.0,0.0);
glRasterPos2i(10,10);
printstring(GLUT_BITMAP_HELVETICA_18,frbuf);
glRasterPos2i(320,10);
printstring(GLUT_BITMAP_HELVETICA_10,"Boicas Written by Miguel Nunes e Tiago Silva (macx@clix.pt)");

if(help)
printhelp();

reshape(scrwidth,scrheight);

glutSwapBuffers();


}


/* Teclas de opções */
static void key(unsigned char k, int x, int y)
{
switch (k) {
case 's':
exit(0);
break;
case 'a':
v-=5;
break;
case 'z':
v+=5;
break;
case 'c':
if(poutline) {
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
poutline=0;
} else {
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
poutline=1;
}
break;
case 'j':
joyactive=(!joyactive);
break;
case 'h':
help=(!help);
break;
case 'f':
fog=(!fog);
break;
case 't':
usetex=(!usetex);
break;
case 'b':
if(bfcull) {
glDisable(GL_CULL_FACE);
bfcull=0;
} else {
glEnable(GL_CULL_FACE);
bfcull=1;
}
break;
}
}

/* Teclas de controlo da camara */
static void special(int k, int x, int y)
{
switch(k) {
case GLUT_KEY_LEFT:
alpha-=3.0;
break;
case GLUT_KEY_RIGHT:
alpha+=3.0;
break;
case GLUT_KEY_DOWN:
beta-=6.0;
break;
case GLUT_KEY_UP:
beta+=6.0;
break;
}
}


int main(int argc, char** argv){

glutInitWindowPosition(100,150);
glutInitWindowSize(WIDTH,HEIGHT);
glutInit(&argc, argv);
//glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBL E);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Boiças");

boicasInit();

glutReshapeFunc(reshape);
glutDisplayFunc(displayBoicas);
glutKeyboardFunc(key);
glutSpecialFunc(special);
glutIdleFunc(displayBoicas);
/*
//Luzes
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
*/
glutMainLoop();

return 0; /* ANSI C requires main to return int. */

}

_____________________________________________

Thank YOU a lot,
Pedro Silva

P.S.: All the comments are in Portuguese....

DaViper
07-02-2001, 07:04 AM
hmmm since you didn't give the code in where you are building the Textur i have to guess...


static int bfcull=1;

if this tunrs on backface culling...

glBegin(GL_QUADS);
glTexCoord2f(0.0,1.0); glVertex3f(75,-10.416,-193); // 6 (1,0,1)
glTexCoord2f(1.0,1.0); glVertex3f(75,-10.416,-293); // 7 (1,1,1)
glTexCoord2f(1.0,0.0); glVertex3f(137,-32.816,-293); // 2 (1,1,0)
glTexCoord2f(0.0,0.0); glVertex3f(137,-32.816,-193); // 1 (1,0,0)
glEnd();

and this is supposed to draw your Polygon..

The whole thing can't work, because you are drawing the backface of your Polygon and that is culled. What you have to do is specify the Polygon and Texturcoordinates counterclockwise, than your are drawing the frontface..

hope that solved the prob

Chris

[This message has been edited by DaViper (edited 07-02-2001).]