2

I have a problem loading a texture using SDL library.

Usually I make programs on Linux but I try to create a code that is compatible with Visual Studio also. On Linux are everything OK but on Visual Studio it crashes in "GL_UNSIGNED_SHORT_5_6_5" in the glTexImage2D(...) function.

Below is a general idea about what i want to do which I inspired by this tutorial:

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
//#include <GL/glext.h> 
#include "SDL.h"

int brick;
float c=0.5;
float rx_min=0, ry_min=0;
float rx_max=1, ry_max=1;

unsigned int LoadTexture(const char* filename);
void DrawTexture(int object);
void setupmywindow();
void myDrawing();


void setupmywindow()
{
    glClearColor(1.0,1.0,1.0,0);  
    glColor3f(0.0, 0.0, 0.0);     
    glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
    gluOrtho2D(rx_min,ry_min, rx_max, ry_max);  
    brick = LoadTexture("brick.bmp");
}

void DrawTexture(int object)
{
    glBindTexture(GL_TEXTURE_2D, object);
    glColor3f(c,c,c);
    glBegin(GL_QUADS);
        glTexCoord2f(0., 1. );
        glVertex2f( rx_min , ry_min );
        glTexCoord2f(0., 0. );
        glVertex2f( rx_min, ry_max );
        glTexCoord2f(1., 0. );
        glVertex2f( rx_max , ry_max );
        glTexCoord2f(1., 1. );
        glVertex2f( rx_max , ry_min );
    glEnd();
}
unsigned int LoadTexture(const char* filename)
{
    SDL_Surface* img=SDL_LoadBMP(filename);
    unsigned int id;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D,id);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->w, img->h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, img->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    SDL_FreeSurface(img);
    return id;
}

void myDrawing()
{    
    glClear(GL_COLOR_BUFFER_BIT);   
    DrawTexture(brick);

    glFlush();

}

int main(int argc, char **argv)
{

    printf("AUTH Computational Physics - Computer Graphics\n");
    printf("Project >>TestTexture.cpp\n");
    printf("--------------------------------------------------------\n");

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowPosition(50,50);
    glutCreateWindow("Texture Test");

    setupmywindow();        
    glutDisplayFunc(myDrawing);  

    glutMainLoop();

    return 0;
}

The error is:

error C2065: 'GL_UNSIGNED_SHORT_5_6_5' : undeclared identifier

Here is the image that I try to load and it is configured as a bitmap (8bit 5 6 5) with GIMP 2.8

NOTE: When I uncoment #include < GL/glext.h > which is not needed on Linux, I get the above message: Unhandled exception at 0x00d1193f in testTesxture.exe: 0xC0000005: Access violation reading location 0x00000014.

Generally if I save a bitmap image (for example with paint) how can I uderstand the type I have to put (GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_BYTE etc)?

Nebula
  • 41
  • 9
  • 1
    Why do you have `#include ` commented out? – olevegard May 13 '13 at 11:49
  • Sorry, I should uncomment it. It compiles but with this result : Unhandled exception at 0x00d1193f in testTesxture.exe: 0xC0000005: Access violation reading location 0x00000014. – Nebula May 13 '13 at 11:59

2 Answers2

3

The problem is likely that Windows uses an older version of OpenGL than Linux, and this old OpenGL version does not have that specific identifier (and others, I'm sure). To get around this and any other possible version problems, I would use GLEW which does the hard work for you.

Victor Sand
  • 2,270
  • 1
  • 14
  • 32
  • Should I change the format of the image, and change GL_UNSIGNED_SHORT_5_6_5 with something else? If yes how can I do that? – Nebula May 13 '13 at 12:02
  • 1
    I would still recommend using GLEW to get past the really really old OpenGL version that Windows uses if not told otherwise. I don't know about what formats are supported by the different versions. – Victor Sand May 13 '13 at 12:05
0

In windows, add this line after the includes:

 #ifndef GL_UNSIGNED_SHORT_5_6_5
 #define GL_UNSIGNED_SHORT_5_6_5 0x8363
 #endif
 #ifndef GL_CLAMP_TO_EDGE
 #define GL_CLAMP_TO_EDGE 0x812F
 #endif

According to this video.

Avi Kud
  • 105
  • 8
User10259
  • 73
  • 1
  • 1
  • 7