| | |
please help with texture mapping on OpenGl.
Thread Solved |
hey,
I am just learning textures in OpenGl, from a certain tutorial site :
http://www.spacesimulator.net/tut3_texturemapping.html
the site had a good tutorial for texture, but after loading the .bmp picture, it goes to create its own function for vertex3f and such ( I think). In any matter, I have not learned that way of style, not yet anyway, but it seems that now I am stuck on how to apply the texture to polygons.
Can you help me?
here is the code where I loaded , made room and associated the
bmp file with openGl, all i need help now is to lather the texture
onto the a polygon, say a box for instance, please help me finish the rest.
this is my loadimage.cpp file
and here is the code for 3d box for which I want to lather the texture with, ( main.cpp)
I am just learning textures in OpenGl, from a certain tutorial site :
http://www.spacesimulator.net/tut3_texturemapping.html
the site had a good tutorial for texture, but after loading the .bmp picture, it goes to create its own function for vertex3f and such ( I think). In any matter, I have not learned that way of style, not yet anyway, but it seems that now I am stuck on how to apply the texture to polygons.
Can you help me?
here is the code where I loaded , made room and associated the
bmp file with openGl, all i need help now is to lather the texture
onto the a polygon, say a box for instance, please help me finish the rest.
this is my loadimage.cpp file
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<GL/glut.h>
#include<windows.h>
using namespace std;
int num_texture = -1;
int LoadBitmap(char* filename)
{
unsigned char *l_texture;
int i,j=0;
File* file;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBTRIPLE rgb;
num_texture++;
if(file = (fopen(filename,"rb") == NULL)//if file does not exist return -1
return 0;
fread(&fileheader,sizeof(fileheader),1,file);
fseek(file,sizeof(fileheader),SEEK_SET);
fread(&infoheader,sizeof(infoheader),1,file);
l_texture = (byte* ) malloc(infoheader.biWidth * infoheader.biHeight * 4);
memset(l_texture,0, malloc(infoheader.biWidth * infoheader.biHeight * 4);
for (i=0; i < infoheader.biWidth * infoheader.biHeight; i++)
{
fread(&rgb, sizeof(rgb), 1, file);
l_texture[j+0] = rgb.rgbtRed; // Red component
l_texture[j+1] = rgb.rgbtGreen; // Green component
l_texture[j+2] = rgb.rgbtBlue; // Blue component
l_texture[j+3] = 255; // Alpha value
j += 4; // Go to the next position
}
fclose(file);
glBindTexture(GL_TEXTURE_2D,num_texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
free(l_texture);
return num_texture;
}and here is the code for 3d box for which I want to lather the texture with, ( main.cpp)
#include<iostream>
#include<cstdlib>
#include<GL/glut.h>
using namespace std;
void InitGL()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
//glEnable(GL_COLOR_MATERIAL);
//glClearColor(0.0f,0.0f,0.0f,1.0f);
//glClear(1.0f);
//glEnable(GL_LIGHTING);
//glEnable(GL_LIGHT0);
//glEnable(GL_LIGHT1);
//glEnable(GL_NORMALIZE);
glEnable(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.0f);
}
void EnableLight()
{
//NOT SET UP YET...
}
void handleResize(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(double)width / (double)height,1.0f,200.0f);
}
void keyboard(unsigned char key,int x, int y)
{
switch(key)
{
case 27: exit(0);
case 'l': EnableLight(); // not set up yet
break;
}
}
GLfloat Yrot = 0.0f;
void disp()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f,0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(Yrot,0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
//Front face
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
//Right face.
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,0.0f);
//Back face.
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
//Left face.
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glEnd();
glutPostRedisplay();
glutSwapBuffers();
}
void update_rot(int val)
{
Yrot += 3.5;
if(Yrot > 360)
Yrot = 0;
glutTimerFunc(50,update_rot,0);
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(550,550);
glutInitWindowPosition(300,100);
glutCreateWindow("Texture Practice!!!!!");
InitGL();
glutDisplayFunc(disp);
glutKeyboardFunc(keyboard);
glutReshapeFunc(handleResize);
glutTimerFunc(50,update_rot,0);
glutMainLoop();
return 0;
} Last edited by firstPerson; Jan 14th, 2009 at 3:16 am.
From main, (after calling glutInit and before calling glutMainLoop), call your bitmap load function, put the return value into a global int variable ( e.g. texture1 ), repeat for however many textures you want, ( i.e. texture2, texture3, etc.. ).
When you want to 'switch a texture on' call glBindTexture ( GL_TEXTURE2D, textureX ). You must do this OUTSIDE of a glBegin/glEnd block.
For every vertex, also send a texture co-ordinate. This is done the same way as you send normals, but you will nearly always want to do this once-per-vertex, e.g.:
This will draw the entire texture on a single polygon. You don't need to call glEnd yet if you want to keep using the same texture for all of the faces.
When you want to 'switch a texture on' call glBindTexture ( GL_TEXTURE2D, textureX ). You must do this OUTSIDE of a glBegin/glEnd block.
For every vertex, also send a texture co-ordinate. This is done the same way as you send normals, but you will nearly always want to do this once-per-vertex, e.g.:
glBindTexture ( GL_TEXTURE2D, texture1 ); glBegin ( GL_QUADS ); glTexcoord2f ( 0, 0 ); glVertex3f(-1.0f,-1.0f,0.0f); glTexcoord2f ( 0, 1 ); glVertex3f(1.0f,-1.0f,0.0f); glTexcoord2f ( 1, 1 ); glVertex3f(1.0f,1.0f,0.0f); glTexcoord2f ( 1, 0 ); glVertex3f(-1.0f,1.0f,0.0f); glEnd ( );
Plato forgot the nullahedron..
thanks matt, but for some reason the image is not sticking to the polygon.
in my texture.h file I have :
in my texture.cpp file , I have :
and in my main.cpp I have
In my texture folder I have a picture saved as art . Its in the attachments. and in this url:
http://www.cc.gatech.edu/cpl/project...ats_resize.bmp
I dont know whats wrong with the program. I mean that i have loaded the bitmap but the texture is not aplying for some reason. Please help.
in my texture.h file I have :
extern int num_texture; extern int Loadbitmap(char* filename);
in my texture.cpp file , I have :
#include<iostream>
#include <stdio.h>
#include <windows.h>
#include <GL/glut.h>
#include "texture.h"
using namespace std;
int num_texture = -1;
int Loadbitmap(char* filename)
{
unsigned char *l_texture;
int i,j=0;
FILE* file;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBTRIPLE rgb;
num_texture++;
file = fopen(filename,"rb");
if(file == NULL)//if file does not exist return -1
return -1;
fread(&fileheader,sizeof(fileheader),1,file);
fseek(file,sizeof(fileheader),SEEK_SET);
fread(&infoheader,sizeof(infoheader),1,file);
l_texture = (byte* ) malloc(infoheader.biWidth * infoheader.biHeight * 4);
memset(l_texture, 0, infoheader.biWidth * infoheader.biHeight * 4);
for (i=0; i < infoheader.biWidth * infoheader.biHeight; i++)
{
fread(&rgb, sizeof(rgb), 1, file);
l_texture[j+0] = rgb.rgbtRed; // Red component
l_texture[j+1] = rgb.rgbtGreen; // Green component
l_texture[j+2] = rgb.rgbtBlue; // Blue component
l_texture[j+3] = 255; // Alpha value
j += 4; // Go to the next position
}
fclose(file);
glBindTexture(GL_TEXTURE_2D,num_texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexImage2D(GL_TEXTURE_2D, 0, 4, infoheader.biWidth, infoheader.biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, l_texture);
free(l_texture);
return num_texture;
}and in my main.cpp I have
#include<iostream>
#include<cstdlib>
#include<GL/glut.h>
#include<windows.h>
#include"texture.h"
using namespace std;
void InitGL()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
//glEnable(GL_COLOR_MATERIAL);
//glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
//glClearColor(0.0f,0.0f,0.0f,1.0f);
//glClear(1.0f);
//glEnable(GL_LIGHTING);
//glEnable(GL_LIGHT0);
//glEnable(GL_LIGHT1);
//glEnable(GL_NORMALIZE);
glEnable(GL_SMOOTH);
glClearColor(0.0f,0.0f,0.0f,0.0f);
Loadbitmap("art");
}
void EnableLight()
{
//NOT SET UP YET...
}
void handleResize(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(double)width / (double)height,1.0f,200.0f);
}
void keyboard(unsigned char key,int x, int y)
{
switch(key)
{
case 27: exit(0);
case 'l': EnableLight(); // not set up yet
break;
}
}
GLfloat Yrot = 0.0f;
void disp()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f,0.0f,0.0f,1.0f);
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(Yrot,0.0f,1.0f,0.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture ( GL_TEXTURE_2D, num_texture );
glBegin(GL_QUADS);
//Front face
glColor3f(1.0f,0.0f,0.0f);
glTexCoord2f ( 0, 0 );
glVertex3f(-1.0f,-1.0f,0.0f);
glTexCoord2f ( 0, 1 );
glVertex3f(1.0f,-1.0f,0.0f);
glTexCoord2f ( 1, 1 );
glVertex3f(1.0f,1.0f,0.0f);
glTexCoord2f ( 1, 0 );
glVertex3f(-1.0f,1.0f,0.0f);
glDisable(GL_TEXTURE_2D);
//Right face.
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,0.0f);
//Back face.
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
//Left face.
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glEnd();
glutPostRedisplay();
glutSwapBuffers();
}
void update_rot(int val)
{
Yrot += 3.5;
if(Yrot > 360)
Yrot = 0;
glutTimerFunc(50,update_rot,0);
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(550,550);
glutInitWindowPosition(300,100);
glutCreateWindow("Texture Practice!!!!!");
InitGL();
glutDisplayFunc(disp);
glutKeyboardFunc(keyboard);
glutReshapeFunc(handleResize);
glutTimerFunc(50,update_rot,0);
glutMainLoop();
return 0;
}In my texture folder I have a picture saved as art . Its in the attachments. and in this url:
http://www.cc.gatech.edu/cpl/project...ats_resize.bmp
I dont know whats wrong with the program. I mean that i have loaded the bitmap but the texture is not aplying for some reason. Please help.
Some things:
- Check the return value of LoadBitmap ( i.e. does the bitmap load atall? ).
- You are loading the file "art" ( without a file extension ). If you want to fopen "art.bmp" file, you have to say so. Also check that the bitmap file is in the application's working directory, or use an absolute path to the file instead.
- You should really call glGenTextures to get a new texture index. All texture indices might work without doing this on some OpenGL implementations, but you shouldn't rely on that being the case.
- You're 'not allowed' to call glDisable within a glBegin/glEnd block.
- Check the return value of LoadBitmap ( i.e. does the bitmap load atall? ).
- You are loading the file "art" ( without a file extension ). If you want to fopen "art.bmp" file, you have to say so. Also check that the bitmap file is in the application's working directory, or use an absolute path to the file instead.
- You should really call glGenTextures to get a new texture index. All texture indices might work without doing this on some OpenGL implementations, but you shouldn't rely on that being the case.
- You're 'not allowed' to call glDisable within a glBegin/glEnd block.
Plato forgot the nullahedron..
![]() |
Similar Threads
- Visual C++ Debugging Problem (C++)
- Audio trouble (PCI and Add-In Cards)
- openGL with c++ (C++)
- Reconstruction of Temple of Zeus at Nemea (Game Development)
- Texture mapping for sphere! (Game Development)
- New Game Announcement (Game Development)
Other Threads in the Game Development Forum
- Previous Thread: help with OPenGl
- Next Thread: equation of a circle
| Thread Tools | Search this Thread |
3d advertising ai algorithm ban c++ cambridge camera censorship china competition console development engine fov fpx game gamer games gaming gauntanamo government idaho in-gameadvertisement intellectualproperty laracroft live manhunt math mathematics matrix mercenaries microsoft mmorpg modded msn naked news nintendo obama opengl palin physics pirate playstation politics projection ps3 rpg search selection software sony stephenhawking stocks studio technology terrorism tombraider uk videogame web wii world-of-warcraft xbox xbox-live xbox360






