Hello,
I’m currently having issues with mapping my texture (256x256 BMP) onto a quad for example. I was following this tutorial: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/ on how to load a BMP texture file. I think my texture is being read but the texture is not mapping properly for some reason: http://i.imgur.com/EQo1Z.png.
So far, this is what I have:
// Texture.cpp
#include "GL/glut.h"
#include "GL/glext.h"
#include "Texture.h"
#include <stdio.h>
Texture::Texture(){}
bool Texture::loadTexture(const char *filename, GLuint texture[], int id){
unsigned char header[54];
unsigned int dataPos;
unsigned int width;
unsigned int height;
unsigned int imageSize;
unsigned char *data;
FILE *file = fopen(filename, "rb");
if(!file){
return false;
}
if(fread(header, 1, 54, file) != 54){
return false;
}else if (header[0] != 'B' || header[1] != 'M'){
return false;
}
dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);
if(imageSize == 0){
imageSize = width * height * 3;
}
if(dataPos == 0){
dataPos = 54;
}
// Create buffer
data = new unsigned char[imageSize];
fread(data, 1, imageSize, file);
fclose(file);
glGenTextures(1, &texture[id]);
glBindTexture(GL_TEXTURE_2D, texture[id]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
free(data);
return true;
}
// main.cpp
#include "GL/glut.h"
#include "Camera.h"
#include "Texture.h"
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
Camera camera;
Texture textureLoader;
GLuint texture[1]; // Test texture
void init(){
textureLoader.loadTexture("test.bmp", texture, 0);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
void drawQuad(){
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-10, -10, 0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-10, 10, 0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(10, 10, 0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(10, -10, 0);
glEnd();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cameraControl();
glLoadIdentity();
gluLookAt(camera.getPos().x, camera.getPos().y, camera.getPos().z,
camera.getLook().x + camera.getPos().x, camera.getLook().y,
camera.getLook().z + camera.getPos().z,
camera.getUp().x, camera.getUp().y, camera.getUp().z);
glEnable(GL_TEXTURE_2D);
drawQuad();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
// PLUS other functions, ie. main, keyboard, reshape etc.
Any help is appreciated!
Thanks.