Texture objects texturing help
Hello fellow forumers. I've got a question about texturing objects in opengl. I've the following code however i'm only able to texture one of the surface. I tried to solve it however there is 2 undesired outcome that i've gotten so far. The first outcome is that the object will only use the latest texture defined and the other result is that both the texture will be combined together. This is the orginal code that i have and is working so far. Any help and guidiance from the senior board member is much appreciated.
#include <gl/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
GLfloat gAngle = 0.0f; //cube rotation angle
// material properties
GLfloat gAmbientMaterial[] = {0.5f, 0.5f, 0.5f, 1.0f};
GLfloat gDiffuseMaterial[] = {0.3f, 0.5f, 0.8f, 1.0f};
GLfloat gSpecularMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLint gShininessMaterial = 100;
//light properties
GLfloat gAmbientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat gDiffuseLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat gLightPosition[] = { 0.0f, 0.0f, 1.0f, 0.0f };
//variables to store texture information
unsigned char* tex_image; //image data
GLuint textureID; //texture id
GLint imageWidth; //image width info
GLint imageHeight; //image height info
// This function reads a RGB bitmap file
unsigned char* LoadBMPFile(char *filename)
{
BITMAPINFOHEADER BMPInfoHeader; //bitmap info header
BITMAPFILEHEADER BMPFileHeader; //bitmap file header
FILE *filePtr; //the file pointer
unsigned char *bitmapImage; //bitmap image data
unsigned char temp; //temp variable for swapping
//RGB values
int size, i = 0; //counter
// open filename for reading in binary mode
if ((filePtr = fopen(filename, "rb")) == NULL)
{
return NULL;
}
// read bitmap file header
fread(&BMPFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
// check whether file is really a bitmap file
if (BMPFileHeader.bfType != 0x4D42)
{
fclose(filePtr); // if file is not a bitmap file the close and return NULL
return NULL;
}
// read bitmap information header
fread(&BMPInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
// locate beginning of bitmap data
fseek(filePtr, BMPFileHeader.bfOffBits, SEEK_SET);
size = BMPInfoHeader.biSizeImage; // store image size
imageWidth = BMPInfoHeader.biWidth; // store image width
imageHeight = BMPInfoHeader.biHeight; // store image height
// allocate memory for image data, check if not allocated properly then close
//file and return NULL
if((bitmapImage = (unsigned char*)malloc(size)) == NULL)
{
fclose(filePtr);
return NULL;
}
// read bitmap data
fread(bitmapImage, 1, size, filePtr);
//colours in bitmap are of the format BGR, hence need to swap B and R to get
//RGB
for (i = 0; i < size; i += 3)
{
temp = bitmapImage;
bitmapImage = bitmapImage[i+2];
bitmapImage[i+2] = temp;
}
fclose(filePtr); // close file
return bitmapImage; // return pointer to image data
}
//set up states that are going to be used
void init()
{
glClearColor(0.0, 0.0, 0.0, 1.0); //clears background colour to black
glEnable(GL_DEPTH_TEST); //enable depth test
//set material properties
glMaterialfv(GL_FRONT, GL_AMBIENT, gAmbientMaterial);
glMaterialfv(GL_FRONT, GL_DIFFUSE, gDiffuseMaterial);
glMaterialfv(GL_FRONT, GL_SPECULAR, gSpecularMaterial);
glMateriali(GL_FRONT, GL_SHININESS, gShininessMaterial);
//setup light 0
glLightfv(GL_LIGHT0, GL_AMBIENT, gAmbientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, gDiffuseLight);
glLightfv(GL_LIGHT0, GL_POSITION, gLightPosition);
//enable lighting and select shading model
glEnable(GL_LIGHT0); //enable light0
glEnable(GL_LIGHTING); //enable lighting
// load BMP file into image
tex_image = LoadBMPFile("check.bmp");
glGenTextures(1, &textureID); // generate texture
glBindTexture(GL_TEXTURE_2D, textureID); // bind texture
// generate texture mipmaps
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imageWidth, imageHeight, GL_RGB,
GL_UNSIGNED_BYTE, tex_image);
// setup texture parameters for currently bound texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D); // enable 2D texturing
}
//called whenever the window is resized (also called once when window is first drawn)
void resizeWindow(int width, int height) //window width and height
{
if(height == 0) //prevent divide by zero
height = 1;
glViewport(0, 0, width, height); //set the viewport
glMatrixMode(GL_PROJECTION); //select projection matrix
glLoadIdentity(); //clear current contents to identity matrix
gluPerspective(60.0f, //set up perspective projection with 60 degrees field of view
(GLfloat) width/(GLfloat) height, //set aspect ratio
1.0f, //set near clipping plane to 1.0
100.0f); //set far clipping plane to 100.0
glMatrixMode(GL_MODELVIEW); //select modelview matrix
glLoadIdentity(); //clear current contents to identity matrix
gluLookAt(0.0f, 0.0f, 3.0f, //set position
0.0f, 0.0f, 0.0f, //set where eye/camera is looking at
0.0f, 1.0f, 0.0f); //set 'up' vector
}
//draws a unit cube
void drawCube()
{
glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f); // top face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glNormal3f(0.0f, 0.0f, 1.0f); // front face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glNormal3f(1.0f, 0.0f, 0.0f); // right face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glNormal3f(-1.0f, 0.0f, 0.0f); // left face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glNormal3f(0.0f, -1.0f, 0.0f); // bottom face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glNormal3f(0.0f, 0.0f, -1.0f); // back face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glEnd();
}
//draw the scene here
void drawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the colour buffer to the colour previously set in glClearColor
glPushMatrix();
glColor3f(0.0, 0.0, 1.0);
glRotatef(gAngle, 1.0f, 1.0f, 1.0f);
drawCube();
glPopMatrix();
glFlush();
glutSwapBuffers(); //swap front and back buffers
}
//called when ASCII key pressed
void myKeypress(unsigned char key, int x, int y)
{
switch(key)
{
//if ESC pressed, quit program
case '\e': exit(1); //quit
free(tex_image); //free image
break;
default: break;
};
}
//called when no event in queue
void myIdleFunc()
{
gAngle += 0.05; //increment rotation angle
if(gAngle >= 360) //wrap around if rotation angle greater than 360
{
gAngle -= 360;
}
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutInitWindowPosition(50, 50);
glutCreateWindow("Texture");
init();
glutDisplayFunc(drawScene);
glutReshapeFunc(resizeWindow);
glutKeyboardFunc(myKeypress);
glutIdleFunc(myIdleFunc);
glutMainLoop(); //enter event loop
}
Well, I only can see one texture loaded, so I assume that's not code that produces the error. Please post your current code using the [source] tags.
However, I couldn't see you binding textures in your draw code, i.e. if you load two textures only the last one will be used. If you want to use different textures, you have to bind the right one before drawing the objects that should use it.
Example:
However, I couldn't see you binding textures in your draw code, i.e. if you load two textures only the last one will be used. If you want to use different textures, you have to bind the right one before drawing the objects that should use it.
Example:
void draw(){ ... //glClear() etc. glBindTexture(textureId[index]); //textureId is an array of all loaded texture ids, index is the index of the texture you want to use drawCube(); ... //matrix setup glBindTexture(textureId[index2]); drawCude(); ... //swap}
Hi this is the code that i have so far.The following code "merges" the 2 textures that is have together.
[Edited by - Murlok on April 21, 2010 12:25:27 AM]
#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <gl/glut.h> //include glut library (automatically includes gl and glu libraries)GLfloat gAngle = 0.0f; //cube rotation angle// material propertiesGLfloat gAmbientMaterial[] = {0.5f, 0.5f, 0.5f, 1.0f};GLfloat gDiffuseMaterial[] = {0.3f, 0.5f, 0.8f, 1.0f};GLfloat gSpecularMaterial[] = {1.0f, 1.0f, 1.0f, 1.0f};GLint gShininessMaterial = 100;//light propertiesGLfloat gAmbientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; //ambient lightGLfloat gDiffuseLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; //diffuse lightGLfloat gLightPosition[] = { 0.0f, 0.0f, 1.0f, 0.0f }; //light position//variables to store texture informationunsigned char* tex_image[2]; //image dataGLuint textureID[2]; //texture idGLint imageWidth; //image width infoGLint imageHeight; //image height info// This function reads a RGB bitmap fileunsigned char* LoadBMPFile(char *filename){ BITMAPINFOHEADER BMPInfoHeader; //bitmap info header BITMAPFILEHEADER BMPFileHeader; //bitmap file header FILE *filePtr; //the file pointer unsigned char *bitmapImage; //bitmap image data unsigned char temp; //temp variable for swapping RGB values int size, i = 0; //counter // open filename for reading in binary mode if ((filePtr = fopen(filename, "rb")) == NULL) { return NULL; } // read bitmap file header fread(&BMPFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr); // check whether file is really a bitmap file if (BMPFileHeader.bfType != 0x4D42) { fclose(filePtr); // if file is not a bitmap file the close and return NULL return NULL; } // read bitmap information header fread(&BMPInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr); // locate beginning of bitmap data fseek(filePtr, BMPFileHeader.bfOffBits, SEEK_SET); size = BMPInfoHeader.biSizeImage; // store image size imageWidth = BMPInfoHeader.biWidth; // store image width imageHeight = BMPInfoHeader.biHeight; // store image height // allocate memory for image data, check if not allocated properly then close file and return NULL if((bitmapImage = (unsigned char*)malloc(size)) == NULL) { fclose(filePtr); return NULL; } // read bitmap data fread(bitmapImage, 1, size, filePtr); // colours in bitmap are of the format BGR, hence need to swap B and R to get RGB for (i = 0; i < size; i += 3) { temp = bitmapImage; bitmapImage = bitmapImage[i+2]; bitmapImage[i+2] = temp; } fclose(filePtr); // close file return bitmapImage; // return pointer to image data}//set up states that are going to be usedvoid init(){ glClearColor(0.0, 0.0, 0.0, 1.0); //clears background colour to black glEnable(GL_DEPTH_TEST); //enable depth test //set material properties glMaterialfv(GL_FRONT, GL_AMBIENT, gAmbientMaterial); //set material ambient component glMaterialfv(GL_FRONT, GL_DIFFUSE, gDiffuseMaterial); //set material diffuse component glMaterialfv(GL_FRONT, GL_SPECULAR, gSpecularMaterial); //set material specular component glMateriali(GL_FRONT, GL_SHININESS, gShininessMaterial); //set material shininess //setup light 0 glLightfv(GL_LIGHT0, GL_AMBIENT, gAmbientLight); //set light0's ambient component glLightfv(GL_LIGHT0, GL_DIFFUSE, gDiffuseLight); //set light0's diffuse component glLightfv(GL_LIGHT0, GL_POSITION, gLightPosition); //set light0's position //enable lighting and select shading model glEnable(GL_LIGHT0); //enable light0 glEnable(GL_LIGHTING); //enable lighting // load BMP file into image tex_image[0] = LoadBMPFile("wall.bmp"); tex_image[1] = LoadBMPFile("check.bmp"); for (int i=0; i < 2; i++) { glGenTextures(2, &textureID); // generate texture gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imageWidth, imageHeight, GL_RGB, GL_UNSIGNED_BYTE, tex_image); } // setup texture parameters for currently bound texture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glEnable(GL_TEXTURE_2D); // enable 2D texturing}//called whenever the window is resized (also called once when window is first drawn)void resizeWindow(int width, int height) //window width and height{ if(height == 0) //prevent divide by zero height = 1; glViewport(0, 0, width, height); //set the viewport glMatrixMode(GL_PROJECTION); //select projection matrix glLoadIdentity(); //clear current contents to identity matrix gluPerspective(60.0f, //set up perspective projection with 60 degrees field of view (GLfloat) width/(GLfloat) height, //set aspect ratio 1.0f, //set near clipping plane to 1.0 100.0f); //set far clipping plane to 100.0 glMatrixMode(GL_MODELVIEW); //select modelview matrix glLoadIdentity(); //clear current contents to identity matrix gluLookAt(0.0f, 0.0f, 3.0f, //set position 0.0f, 0.0f, 0.0f, //set where eye/camera is looking at 0.0f, 1.0f, 0.0f); //set 'up' vector}//draws a unit cubevoid drawCube(){ glBegin(GL_QUADS); glBindTexture(GL_TEXTURE_2D, textureID[0]); glNormal3f(0.0f, 1.0f, 0.0f); // top face glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(-0.5f, 0.5f, 0.5f); glBindTexture(GL_TEXTURE_2D, textureID[0]); glNormal3f(0.0f, 0.0f, 1.0f); // front face glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, -0.5f, 0.5f); glBindTexture(GL_TEXTURE_2D, textureID[0]); glNormal3f(1.0f, 0.0f, 0.0f); // right face glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(0.5f, -0.5f, -0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, 0.5f, -0.5f); glBindTexture(GL_TEXTURE_2D, textureID[1]); glNormal3f(-1.0f, 0.0f, 0.0f); // left face glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glBindTexture(GL_TEXTURE_2D, textureID[1]); glNormal3f(0.0f, -1.0f, 0.0f); // bottom face glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(0.5f, -0.5f, -0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, -0.5f, 0.5f); glNormal3f(0.0f, 0.0f, -1.0f); // back face glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f); glTexCoord2f(2.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f); glTexCoord2f(2.0f, 2.0f); glVertex3f(-0.5f, 0.5f, -0.5f); glTexCoord2f(0.0f, 2.0f); glVertex3f(0.5f, 0.5f, -0.5f); glEnd();}//draw the scene herevoid drawScene(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the colour buffer to the colour previously set in glClearColor glPushMatrix(); glColor3f(0.0, 0.0, 1.0); glRotatef(gAngle, 1.0f, 1.0f, 1.0f); drawCube(); glPopMatrix(); glFlush(); glutSwapBuffers(); //swap front and back buffers}//called when ASCII key pressedvoid myKeypress(unsigned char key, int x, int y){ switch(key) { //if ESC pressed, quit program case '\e': exit(1); //quit free(tex_image); //free image break; default: break; };}//called when no event in queuevoid myIdleFunc(){ gAngle += 0.1; //increment rotation angle if(gAngle >= 360) //wrap around if rotation angle greater than 360 { gAngle -= 360; } glutPostRedisplay(); //refresh display}int main(int argc, char* argv[]){ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //requests properties for the window (sets up the rendering context) glutInitWindowSize(800, 600); //set window size in pixels glutInitWindowPosition(50, 50); //set window position from top-left corner of display glutCreateWindow("Texture"); //set window title init(); //call function to setup states glutDisplayFunc(drawScene); //register display callback function glutReshapeFunc(resizeWindow); //register resize callback function glutKeyboardFunc(myKeypress); //register non-ASCII keypress callback function glutIdleFunc(myIdleFunc); //idle callback function glutMainLoop(); //enter event loop}
[Edited by - Murlok on April 21, 2010 12:25:27 AM]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement