Any idea whats wrong with my code? when i execute glCompressedTexImage2D() the program just crashes (comes the Windows XP crash message thing...)
Im trying to load DDS image without mipmaps, the image format is DDS DXT1
Am i missing some include file, or what did i do wrong? I downloaded the included files from: http://sourceforge.net/projects/glew/files/glew/1.5.1/glew-1.5.1-win32.zip/download
I have glew32.dll in the same folder as my .exe is.
The code below has only the parts i changed to be able to load DDS images:
#pragma comment(lib, "glew32.lib")
#include <GL\glew.h>
#include <GL\gl.h>
...
typedef struct {
GLuint dwSize;
GLuint dwFlags;
GLuint dwFourCC;
GLuint dwRGBBitCount;
GLuint dwRBitMask;
GLuint dwGBitMask;
GLuint dwBBitMask;
GLuint dwABitMask;
} DDS_PIXELFORMAT;
typedef struct {
GLuint dwMagic;
GLuint dwSize;
GLuint dwFlags;
GLuint dwHeight;
GLuint dwWidth;
GLuint dwLinearSize;
GLuint dwDepth;
GLuint dwMipMapCount;
GLuint dwReserved1[11];
DDS_PIXELFORMAT ddpf;
GLuint dwCaps;
GLuint dwCaps2;
GLuint dwCaps3;
GLuint dwCaps4;
GLuint dwReserved2;
} DDS_HEADER;
DDS_HEADER DDS_headers;
...
FILE *fp = fopen("test.dds", "rb");
fread(&DDS_headers, 1, sizeof(DDS_headers), fp);
img_width = DDS_headers.dwWidth;
img_height = DDS_headers.dwHeight;
maxsize = (img_width*img_height)/2;
unsigned char *imgdata = (unsigned char *)malloc(maxsize);
fread(imgdata, 1, maxsize, fp);
fclose(fp);
GLuint texID;
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_PALETTE4_R5_G6_B5_OES, img_width, img_height, 0, maxsize, imgdata);
// NOTICE:
// Ive also tried with function:
// glCompressedTexImage2DARB();
// and internalformats: GL_COMPRESSED_RGB_S3TC_DXT1_EXT and all of the possible formats... its not a format error.
I remember messing with the DDS loader in glew, I don't think the header information there is correct. I never could get it to work correctly.
The best way would be to use the header contstucts that are in DDraw.h here's what I was able to use for DXT1,3,and 5, which if I remember correctly are the only ones that can work in OpenGL.
This particular bit of code makes a few assumptions of the DDS file we are trying to load, first that is is a compressed file, either DXT1,3, or 5, and that the DDS file has pre-generated mipmaps saved in it, hence we don't have to generate them ourselves.
I hope this was able to help you it took me some time to get it working correctly myself. If there's anything in this code snippet that seems unclear, let me know and I'll help you further.