I am new to opengl. I am so confused with glTexCoord2f. I don't know how to provide the coordinates. I just know coordinate should be (0,0) (0,1) (1,0) and (1,1).When I provide a texture on a plane ( here plane is for a door) , it does not display the bmp image properly..I have tried by changing coordinates randomly but the shape of the image changes but it is not displaying the image straight vertical. What will be the coordinates to show the image as it is ( a straight vertical door) .
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, main_door);
glBegin(GL_QUADS);{
glTexCoord2f(0,0);
glVertex3f(-400,0,0);
glTexCoord2f(1,0);
glVertex3f(400,0,0);
glTexCoord2f(1,1);
glVertex3f(400,0,1000);
glTexCoord2f(1,0);
glVertex3f(-400,0,1000);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
My full code
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<windows.h>
#include<GL/glut.h>
double cameraAngle;
double move_X, move_Y, move_Z;
int canDrawGrid, canDrawAxis,canDrawBase;
double cameraRadius, cameraHeight, cameraAngleDelta;
int num_texture = -1;
GLuint grassimg,md1img,brick_d123,dome_top,dome_t_d,dome_t_d_2,floorimg,sideimg,main_door;
int LoadBitmapImage(char *filename)
{
int i, j=0;
FILE *l_file;
unsigned char *l_texture;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBTRIPLE rgb;
num_texture++;
if( (l_file = fopen(filename, "rb"))==NULL) return (-1);
fread(&fileheader, sizeof(fileheader), 1, l_file);
fseek(l_file, sizeof(fileheader), SEEK_SET);
fread(&infoheader, sizeof(infoheader), 1, l_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, l_file);
l_texture[j+0] = rgb.rgbtRed;
l_texture[j+1] = rgb.rgbtGreen;
l_texture[j+2] = rgb.rgbtBlue;
l_texture[j+3] = 255;
j += 4;
}
fclose(l_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);
// glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
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);
}
void loadImage()
{
grassimg = LoadBitmapImage("image/brick.bmp");
brick_d123 = LoadBitmapImage("image/brick_d123.bmp");
md1img = LoadBitmapImage("image/m_d_1.bmp");
dome_top = LoadBitmapImage("image/dome_top.bmp");
dome_t_d = LoadBitmapImage("image/dome_t_d.bmp");
dome_t_d_2 = LoadBitmapImage("image/dome_t_d_2.bmp");
floorimg = LoadBitmapImage("image/floor.bmp");
sideimg = LoadBitmapImage("image/side_1.bmp");
main_door = LoadBitmapImage("image/main_door.bmp");
printf("Load successful");
}
void choto_gombuj(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ,double sx,double sy, double sz){
glPushMatrix();{
glTranslatef(tx,ty,tz);
glRotatef(deg,axisX,axisY,axisZ);
glScalef(sx,sx,sz);
//CG_base_cyclindeer
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, brick_d123);
gluCylinder(obj,190,190,60,20,20);
}
glDisable(GL_TEXTURE_2D);
//CG_base_base_dakna
glColor3f(0,0,0);
glPushMatrix();{
glTranslatef(0,0,59);
glutSolidCone(189,1,20,20);
}glPopMatrix();
//CG_Cylinder_pillar_8
glPushMatrix();{
glTranslatef(120,120,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(170,0,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(120,-120,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,-170,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(-120,-120,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(-170,0,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(-120,120,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,170,59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
gluCylinder(obj,12,12,220,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,0,220+59);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, md1img);
gluCylinder(obj,220,0,60,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
// main_dome
glPushMatrix();{
glColor3f(1,1,1);
glTranslatef(0,0,440);
glPushMatrix();{
glTranslatef(0,0,150);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_t_d);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,160,0,130,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
double equ[4];
equ[0]=0;
equ[1]=0;
equ[2]=1;
equ[3]=150;
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_top);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);{
gluSphere(obj,220,20,20);
}glDisable(GL_CLIP_PLANE0);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
//dome_top_balls
glPushMatrix();{
glTranslatef(0,0,740);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluSphere(obj,40,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,0,810);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluSphere(obj,35,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,0,865);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluSphere(obj,30,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
glPushMatrix();{
glTranslatef(0,0,910);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, dome_t_d_2);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluSphere(obj,25,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
}glPopMatrix();
}
void minar(double tx,double ty, double tz,double deg,double axisX,double axisY,double axisZ){
glPushMatrix();{
glTranslatef(tx,ty,tz);
glRotatef(deg,axisX,axisY,axisZ);
//Minar_base
GLUquadricObj *obj = gluNewQuadric();
glColor3f(0,0,0);
glPushMatrix();{
gluCylinder(obj,150,140,240,20,20);
}glPopMatrix();
//Minar_base_base_dakna
glColor3f(1,0,0);
glPushMatrix();{
glTranslatef(0,0,240);
glutSolidCone(142,1,20,20);
}glPopMatrix();
//Minar_main_pillar
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, grassimg);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,105,70,1500,20,20);
}
glDisable(GL_TEXTURE_2D);
//Minar_design_3_plate_1
glPushMatrix();{
glTranslatef(0,0,600);
glRotatef(180,0,1,0);
glColor3f(1,1,1);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, md1img);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,135,0,100,20,20);
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, brick_d123);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,135,0,1,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
////Minar_design_3_plate_2
glPushMatrix();{
glTranslatef(0,0,1050);
glColor3f(1,1,1);
glRotatef(180,0,1,0);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, md1img);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,120,0,100,20,20);
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, brick_d123);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,120,0,1,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
////Minar__design_3_plate_3
glPushMatrix();{
glTranslatef(0,0,1500);
glColor3f(1,1,1);
glRotatef(180,0,1,0);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, md1img);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,105,0,100,20,20);
}
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, brick_d123);
GLUquadricObj *obj = gluNewQuadric();
gluQuadricTexture(obj,GL_TRUE);
gluCylinder(obj,105,0,1,20,20);
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
choto_gombuj(0,0,1500,0,0,0,0,0.4,0.4,0.4);
}glPopMatrix();
}
void display(){
//codes for Models, Camera
//clear the display
//glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0,0,0,0); //color black
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear buffers to preset values
/***************************
/ set-up camera (view) here
****************************/
//load the correct matrix -- MODEL-VIEW matrix
glMatrixMode(GL_MODELVIEW); //specify which matrix is the current matrix
//initialize the matrix
glLoadIdentity(); //replace the current matrix with the identity matrix [Diagonals have 1, others have 0]
//now give three info
//1. where is the camera (viewer)?
//2. where is the camera looking?
//3. Which direction is the camera's UP direction?
//gluLookAt(0,-150,20, 0,0,0, 0,0,1);
gluLookAt(cameraRadius*sin(cameraAngle), -cameraRadius*cos(cameraAngle), cameraHeight, 0,0,0, 0,0,1);
//again select MODEL-VIEW
glMatrixMode(GL_MODELVIEW);
/**************************************************
/ Grid and axes Lines(You can remove them if u want)
***************************************************/
// draw the three major AXES
if(canDrawAxis==1){
glBegin(GL_LINES);
//X axis
glColor3f(0, 1, 0); //100% Green
glVertex3f(-4000, 0, 0);
glVertex3f( 4000, 0, 0);
//Y axis
glColor3f(0, 0, 1); //100% Blue
glVertex3f(0, -4000, 0); // intentionally extended to -150 to 150, no big deal
glVertex3f(0, 4000, 0);
//Z axis
glColor3f(1, 1, 1); //100% White
glVertex3f( 0, 0, -4000);
glVertex3f(0, 0, 4000);
glEnd();
}
if(canDrawGrid == 1){
//some gridlines along the field
int i;
glColor3f(0.5, 0.5, 0.5); //grey
glBegin(GL_LINES);
for(i=-160;i<=160;i++){
if(i==0)
continue; //SKIP the MAIN axes
//lines parallel to Y-axis
glVertex3f(i*20, -3600, 0);
glVertex3f(i*20, 3600, 0);
//lines parallel to X-axis
glVertex3f(-3600, i*20, 0);
glVertex3f( 3600, i*20, 0);
}
glEnd();
}
/****************************
/ Add your objects from here
****************************/
if(canDrawBase == 1){
//base_floor
glColor3f(0,1,0);
glBegin(GL_QUADS);{
glVertex3f(-3600,3600,0);
glVertex3f(3600,3600,0);
glVertex3f(3600,-3600,0);
glVertex3f(-3600,-3600,0);
}glEnd();
}
//taj_base
glColor3f(1,1,1);
//right_base_wall
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, sideimg);
glBegin(GL_QUADS);{
glColor3f(1,1,1);
glTexCoord2f(0,1);
glVertex3f(2000,2000,0);
glTexCoord2f(0,0);
glVertex3f(2000,-2000,0);
glTexCoord2f(1,0);
glVertex3f(2000,-2000,240);
glTexCoord2f(1,1);
glVertex3f(2000,2000,240);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1,1,1);
//left_base_wall
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, sideimg);
glBegin(GL_QUADS);{
glColor3f(1,1,1);
glTexCoord2f(0,1);
glVertex3f(-2000,2000,0);
glTexCoord2f(0,0);
glVertex3f(-2000,-2000,0);
glTexCoord2f(1,0);
glVertex3f(-2000,-2000,240);
glTexCoord2f(1,1);
glVertex3f(-2000,2000,240);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1,1,1);
//back_base_wall
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, sideimg);
glBegin(GL_QUADS);{
glColor3f(1,1,1);
glTexCoord2f(0,1);
glVertex3f(-2000,2000,0);
glTexCoord2f(0,0);
glVertex3f(2000,2000,0);
glTexCoord2f(1,0);
glVertex3f(2000,2000,240);
glTexCoord2f(1,1);
glVertex3f(-2000,2000,240);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1,1,1);
//font__base_wall
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, sideimg);
glBegin(GL_QUADS);{
glColor3f(1,1,1);
glTexCoord2f(0,1);
glVertex3f(-2000,-2000,0);
glTexCoord2f(0,0);
glVertex3f(2000,-2000,0);
glTexCoord2f(1,0);
glVertex3f(2000,-2000,240);
glTexCoord2f(1,1);
glVertex3f(-2000,-2000,240);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1,1,1);
//font_top_wall
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, floorimg);
glBegin(GL_QUADS);{
glColor3f(1,1,1);
glTexCoord2f(0,1);
glVertex3f(-2000,2000,240);
glTexCoord2f(0,0);
glVertex3f(2000,2000,240);
glTexCoord2f(1,0);
glVertex3f(2000,-2000,240);
glTexCoord2f(1,1);
glVertex3f(-2000,-2000,240);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
/*//taj_base_shiri_cube
glColor3f(1,0,0);
glPushMatrix();{
glTranslatef(0,-2050,120);
//glRotatef(-16,1,0,0);
glScalef(500,100,240);
glutSolidCube(1);
}glPopMatrix();
*/
minar(-1950,-1950,0,0,0,0,0);
minar(1950,-1950,0,0,0,0,0);
minar(1950,1950,0,0,0,0,0);
minar(-1950,1950,0,0,0,0,0);
//taj_main_building
glColor3f(1,1,1);
glPushMatrix();{
glTranslatef(0,-1200,240);
glEnable(GL_TEXTURE_2D);{
glBindTexture(GL_TEXTURE_2D, main_door);
glBegin(GL_QUADS);{
glTexCoord2f(0,0);
glVertex3f(-400,0,0);
glTexCoord2f(1,0);
glVertex3f(400,0,0);
glTexCoord2f(1,1);
glVertex3f(400,0,1000);
glTexCoord2f(1,1);
glVertex3f(-400,0,1000);
}glEnd();
}
glDisable(GL_TEXTURE_2D);
}glPopMatrix();
//ADD this line in the end --- if you use double buffer (i.e. GL_DOUBLE)
glutSwapBuffers();
}
void animate(){
//codes for any changes in Models, Camera
//cameraAngle += cameraAngleDelta; // camera will rotate at 0.002 radians per frame.
//codes for any changes in Models
//MISSING SOMETHING? -- YES: add the following
glutPostRedisplay(); //this will call the display AGAIN
}
void init(){
//codes for initialization
loadImage();
cameraAngle = 0; //angle in radian
move_X = 0;
move_Y = 0;
move_Z = 0;
canDrawGrid = 1;
canDrawAxis = 1;
canDrawBase = 1;
cameraAngleDelta = .001;
cameraRadius = 4000;
cameraHeight = 500;
//clear the screen
glClearColor(0,0,0, 0);
/************************
/ set-up projection here
************************/
//load the PROJECTION matrix
glMatrixMode(GL_PROJECTION);
//initialize the matrix
glLoadIdentity();
/*
gluPerspective() — set up a perspective projection matrix
fovy - Specifies the field of view angle, in degrees, in the y direction.
aspect ratio - Specifies the aspect ratio that determines the field of view in the x direction. The aspect ratio is the ratio of x (width) to y (height).
zNear - Specifies the distance from the viewer to the near clipping plane (always positive).
zFar - Specifies the distance from the viewer to the far clipping plane (always positive).
*/
gluPerspective(70, 1, 0.1, 10000.0);
}
void keyboardListener(unsigned char key, int x,int y){
switch(key){
case '1':
move_X += 1;
break;
case '2':
move_X -= 1;
break;
case '3':
move_Y += 1;
break;
case '4':
move_Y -= 1;
break;
case '5':
move_Z += 1;
break;
case '6':
move_Z -= 1;
break;
case '8':
break;
case 'g':
canDrawGrid ^= 1;
break;
case 'h':
canDrawAxis ^= 1;
break;
case 'p':
break;
case 'z':
canDrawBase ^= 1;
break;
default:
break;
}
}
void specialKeyListener(int key, int x,int y){
switch(key){
case GLUT_KEY_DOWN: //down arrow key
cameraRadius += 40;
break;
case GLUT_KEY_UP: // up arrow key
if(cameraRadius > 40)
cameraRadius -= 40;
break;
case GLUT_KEY_RIGHT:
cameraAngle += 0.05;
break;
case GLUT_KEY_LEFT:
cameraAngle -= 0.05;
break;
case GLUT_KEY_PAGE_UP:
cameraHeight += 40;
break;
case GLUT_KEY_PAGE_DOWN:
cameraHeight -= 40;
break;
case GLUT_KEY_INSERT:
break;
case GLUT_KEY_HOME:
// cameraAngleDelta = 0.001;
break;
case GLUT_KEY_END:
// cameraAngleDelta = 0;
break;
default:
break;
}
}
void mouseListener(int button, int state, int x, int y){ //x, y is the x-y of the screen (2D)
switch(button){
case GLUT_LEFT_BUTTON:
if(state == GLUT_DOWN){ // 2 times?? in ONE click? -- solution is checking DOWN or UP
cameraAngleDelta = -cameraAngleDelta;
}
break;
case GLUT_RIGHT_BUTTON:
if(cameraRadius > 40)
cameraRadius -= 40;
break;
case GLUT_MIDDLE_BUTTON:
//........
break;
default:
break;
}
}
int main(int argc, char **argv){
glutInit(&argc,argv); //initialize the GLUT library
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
/*
glutInitDisplayMode - inits display mode
GLUT_DOUBLE - allows for display on the double buffer window
GLUT_RGBA - shows color (Red, green, blue) and an alpha
GLUT_DEPTH - allows for depth buffer
*/
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Some Title");
init(); //codes for initialization
glEnable(GL_DEPTH_TEST); //enable Depth Testing
glutDisplayFunc(display); //display callback function
glutIdleFunc(animate); //what you want to do in the idle time (when no drawing is occuring)
glutKeyboardFunc(keyboardListener);
glutSpecialFunc(specialKeyListener);
glutMouseFunc(mouseListener);
glutMainLoop(); //The main loop of OpenGL
return 0;
}
There is a gotcha that catches a lot of people off guard when using RGB image formats, which is that pixel rows are expected to begin on 4-byte boundaries by default in GL.
From your description it is not your texture coordinates that are to blame at all.
The actual data that GL read in the first place was misinterpreted and it pulled each row of your texture from the wrong data location. If your bitmap's width is not a multiple of 4 then you will need to tell GL to use different rules when unpacking the pixel data transferred to it.
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
It is very important to note here that DIB (.bmp
) images already satisfy the 4-byte row alignment rules that OpenGL expects. If you correctly read a .bmp
image, this problem never exists in the first place.
You have not compensated for the padding at the end of each row that will already be present in a .bmp
file whose width is not a multiple of 4. That needs to be done first and will make the GL command above unnecessary.