1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #define LDET_NO_FILTER 0
#define LDET_LINEAR 1
#define LDET_BILINEAR 2
#define LDET_TRILINEAR 3
#define LDET_ANISOTROPIC 4
struct LDEldet
{
LDEboolean *data;
LDEuint h, w, bpp;
string name;
void load(string path, LDEuint & id, LDEuint mode )
{
name = path;
ifstream file( LDEstc(path) );
file.read( (char*)&w, sizeof(LDEuint) );
file.read( (char*)&h, sizeof(LDEuint) );
file.read( (char*)&bpp, sizeof(LDEuint) );
data = new LDEboolean[ bpp*w*h ];
file.read(reinterpret_cast<char*>(data), bpp*w*h );
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D,id);
gluBuild2DMipmaps(GL_TEXTURE_2D,
bpp, // bpp
w, // largeur
h, // hauteur
(bpp == 3 ? GL_RGB : GL_RGBA), // type
GL_UNSIGNED_BYTE, //
data);
free(data); // close our data
// filter
switch ( mode )
{
case LDET_NO_FILTER:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
break;
case LDET_LINEAR:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
break;
case LDET_BILINEAR:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
break;
case LDET_TRILINEAR:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
break;
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
case LDET_ANISOTROPIC:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 2.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
break;
#endif
}
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
}; |
Partager