Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


xla

Member Since 06 Feb 2014
Offline Last Active Feb 09 2014 06:08 PM

Topics I've Started

Loading image into OpenGL

06 February 2014 - 03:55 PM

Iam trying to load a bmp image into OpenGL. The program works fine but the image does not appear. The source code below does not contain any errors. Could you please help.

 

Thanks


SOLVED: THE CODE BELOW WORKS.
 
#include "stdafx.h"
#include <stdlib.h>
#include "glut.h"
#include <math.h>
#include <stdio.h>
float fTranslate = 0.0;
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\n");
}
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)
{
 
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0, 500, 0, 500);
 
t1 = AllocateTextureBuffer(256, 256, 4);
if (ReadTextureData("globe.bmp", t1) == 0)
{
printf("error\n");
return false;
}
 
BuildTexture (t1);
 
DeallocateTexture (t1);
 
glEnable(GL_TEXTURE_2D);
 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
return true;
}
void quad(){
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
 
glTexCoord2f(1.0, 0.0);glVertex3f( 112, 112, 0.0);
glTexCoord2f(1.0, 1.0);glVertex3f( 112, -112, 0.0);
glTexCoord2f(0.0, 1.0);glVertex3f( -112, -112, 0.0);
glTexCoord2f(0.0, 0.0);glVertex3f( -112, 112, 0.0);
glEnd();
}
GLvoid DrawGLScene (GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT);
 
glColor3f(1.0,1.0,1.0);
 
glBindTexture(GL_TEXTURE_2D, texture[0]);
glPushMatrix();
glTranslatef(250,250,0);
quad();
glPopMatrix();
 
glutSwapBuffers();
glutPostRedisplay();
}
 
 
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(350, 200);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
 
glutCreateWindow("Image");
 
InitGL();
glutDisplayFunc(DrawGLScene);
glutMainLoop();
return 0;

PARTNERS