loading raw image

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-&gt;width = w;
	ti-&gt;height = h;
	ti-&gt;format = f;

	c = (unsigned char *)malloc(w * h * f);

	if (c != NULL) {
		ti-&gt;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-&gt;height-1; i&gt;=0; i--)
	{
		p = buffer-&gt;data + (i * stride);
		for (j = 0; j &lt; buffer-&gt;width; j++)
		{
			for (k = 0; k &lt; buffer-&gt;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; 

}

Why do you read all pixel in sequence when loading the RAW. You can directly read a whole line and put it in your buffer. I wrote a RAW loader and did so :

// Load data
GLubyte* tmp = new GLubyte[4wh];
memset(tmp, 0, 4whsizeof(GLubyte));
fp = fopen(name, “rb”);
for (int i = 0; i < 4
w*h; i+=4)
{
fread(&tmp[i], sizeof(GLubyte), 3, fp);
tmp[i+3] = 255;
}
fclose(fp);

// Invert texture
GLubyte* data= new GLubyte[4wh];
memset(data, 0, 4whsizeof(GLubyte));
for (i = 0; i < h; ++i)
{
memcpy(&data[4
w*(h-i-1)], &tmp[4wi], 4*w);
}

delete [] tmp;

Now for your problem, it is certainly due to the texture coordinates you define in the DrawGLScene() : all vertices of the quad have the same texture coordinate.

Thank’s for your reply!!! I have my raw image loaded.

Originally posted by morbac:
[b]Why do you read all pixel in sequence when loading the RAW. You can directly read a whole line and put it in your buffer. I wrote a RAW loader and did so :

// Load data
GLubyte* tmp = new GLubyte[4wh];
memset(tmp, 0, 4whsizeof(GLubyte));
fp = fopen(name, “rb”);
for (int i = 0; i < 4
w*h; i+=4)
{
fread(&tmp[i], sizeof(GLubyte), 3, fp);
tmp[i+3] = 255;
}
fclose(fp);

// Invert texture
GLubyte* data= new GLubyte[4wh];
memset(data, 0, 4whsizeof(GLubyte));
for (i = 0; i < h; ++i)
{
memcpy(&data[4
w*(h-i-1)], &tmp[4wi], 4*w);
}

delete tmp;

Now for your problem, it is certainly due to the texture coordinates you define in the DrawGLScene() : all vertices of the quad have the same texture coordinate.[/b]