19,469
社区成员
发帖
与我相关
我的任务
分享
using namespace std;
#include"Texture.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
Texture::Texture
{
}
Texture::~Texture
{
}
void Texture::Load(char *name)
{
texturename = strlwr(strdup(name));
if (strstr(texturename, "\"))
texturename = strtok(texturename, "\");
if(strstr(texturename, ".bmp"))
LoadBMP(texturename);
}
void Texture::LoadFromResource(char *name)
{
texturename = strlwr(strdup(name));
if(strstr(texturename, ".bmp"))
LoadBMPResource(name);
}
void Texture::Use()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture[0]);
}
void Texture::LoadBMP(char *name)
{
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1);
TextureImage[0] = auxDIBImageLoad(name);
width = TextureImage[0]->sizeX;
height = TextureImage[0]->sizeY;
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
if (TextureImage[0])
{
if (TextureImage[0]->data)
{
free(TextureImage[0]->data);
}
free(TextureImage[0]);
}
}
void Texture::LoadBMPResource(char *name)
{
HRSRC hrsrc = FindResource(0, name, RT_BITMAP);
if (hrsrc==0)
return;
HGLOBAL resource = LoadResource(0, hrsrc);
if (resource==0)
return;
void *buffer = LockResource(resource);
BITMAP *bmp = (BITMAP*)buffer;
width = bmp->bmWidth;
height = bmp->bmHeight;
unsigned char *ptr = (unsigned char *)buffer+sizeof(BITMAPINFO)+2;
unsigned char temp;
for (int i = 0; i < width*height; i++)
{
temp = ptr[i*3];
ptr[i*3] = ptr[i*3+2];
ptr[i*3+2] = temp;
}
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, (unsigned char *)buffer+sizeof(BITMAPINFO)+2);
free(buffer);
free(bmp);
}
void Texture::BuildColorTexture(unsigned char r,unsigned char g,unsigned char b)
{
unsigned char data[12];
for(int i = 0; i < 12; i += 3)
{
data[i] = r;
data[i+1] = g;
data[i+2] = b;
}
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 2, 2, GL_RGB, GL_UNSIGNED_BYTE, data);
}