I have a problem loading a raw image and I don´t know what happen with my code. It seems to be good, it loads the image but only appears a colour similar to the real image. What can I do???
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glut.h>
#include <stdio.h>
GLuint texture[1];
typedef struct Texture_Image
{
int width;
int height;
int format;
unsigned char *data;
} TEXTURE_IMAGE;
typedef TEXTURE_IMAGE *P_TEXTURE_IMAGE;
P_TEXTURE_IMAGE t1;
P_TEXTURE_IMAGE AllocateTextureBuffer(GLint w, GLint h, GLint f)
{
P_TEXTURE_IMAGE ti=NULL;
unsigned char *c=NULL;
ti = (P_TEXTURE_IMAGE)malloc(sizeof(TEXTURE_IMAGE));
if (ti != NULL) {
ti->width = w;
ti->height = h;
ti->format = f;
c = (unsigned char *)malloc(w * h * f);
if (c != NULL) {
ti->data = c;
}
else {
printf("error");
return NULL;
}
}
else
{
printf("error");
return NULL;
}
return ti;
}
void DeallocateTexture(P_TEXTURE_IMAGE t)
{
if(t)
{
if(t->data)
{
free(t->data);
}
free(t);
}
}
int ReadTextureData (char *filename, P_TEXTURE_IMAGE buffer)
{
FILE *f;
int i, j, k, done = 0;
int stride = buffer->width * buffer->format;
unsigned char *p = NULL;
f = fopen(filename, "rb");
if (f !=NULL)
{
for (i = buffer->height-1; i>=0; i--)
{
p = buffer->data + (i * stride);
for (j = 0; j < buffer->width; j++)
{
for (k = 0; k < buffer->format-1; k++, p++, done++)
{
*p = fgetc(f);
}
*p = 255; p++;
}
}
fclose(f);
}
else
{
printf("name error
");
}
return done;
}
void BuildTexture (P_TEXTURE_IMAGE tex)
{
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex->width, tex->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex->data);
}
int InitGL(GLvoid)
{
t1 = AllocateTextureBuffer(256, 256, 4);
if (ReadTextureData(“prueba.raw”, t1) == 0)
{
printf("error
");
return FALSE;
}
BuildTexture (t1);
DeallocateTexture (t1);
glEnable(GL_TEXTURE_2D);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
return TRUE;
}
GLvoid DrawGLScene (GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(1.0, 1.0);glVertex3f( 2, 2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( 2, -2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( -2, -2, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( -2, 2, 0.0);
glEnd();
glutSwapBuffers();
glutPostRedisplay();
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(350, 200);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("RAW");
InitGL();
glutDisplayFunc(DrawGLScene);
glutMainLoop();
return 0;
}