Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ola pessoal.
Antes de tudo desculpem se isso foge muito do conteudo desse forum, mas espero que possa ser interessante para aqueles que buscam uma introducao a OpenGL + GLUT + C++.
Primeiro Post - BMP Loader
Segundo Post - Camera 3d
Terceiro Post - Programa teste
Compilado no Windows Vista com Visual Studio 2005
A Primeira classe serve para carregar imagens em .BMP
Do jeito que foi projetada, ela pode guardar apenas uma imagem por vez. Então se quiser trabalhar com varias imagens pode-se usar o valor retornado por LoadBitmap para ir armazenando as imagens em outras variaveis.
No meu caso eu precisava apenas das texturas, e fiz dois metodos, voce pode criar uma textura a partir da ultima imagem carregada, ou carregar a imagem ja como textura. Quando se carrega como textura a imagem é deletada, ficando apenas a textura.
CBMPLoader.h
#include <windows.h>
#include <GL/glut.h>
#include <iostream>
#include <fstream>
using namespace std;
#define BITMAP_ID 0x4D42 // Identificacao do BMP ( Magic Number )
#define MAX_TEXTURES 10 // Definindo a quantidade maxima de texturas que posso usar ( se quiser usar mais texturas q isso, é soh alterar )
class CBMPLoader
{
public:
CBMPLoader();
~CBMPLoader();
unsigned char* LoadBitmap(char *filename); // Carrega um arquivo bmp apartir do seu caminho e retorna o vetor contendo os pixels da imagem
void CreateTexture(int id); // Cria uma textura com a imagem atual
void LoadTextureFromBitmap(char *filename,int id); // Engloba os dois metodos acima, uma facilitacao apenas
void FreeImage(); // libera a imagem
private:
unsigned int uiID; // ID da textura
int iImageWidth; // Largura
int iImageHeight; // Altura
unsigned char *image; // Ponteiro para a imagem
unsigned int textureVec[MAX_TEXTURES]; // Vetor que armazena as Id das texturas
};
CBMPLoader.cpp
#include"CBMPLoader.h"
CBMPLoader::CBMPLoader()
{
// Inicializa as variaveis
image = 0;
iImageWidth = 0;
iImageHeight = 0;
glGenTextures(MAX_TEXTURES,textureVec);
}
CBMPLoader::~CBMPLoader()
{
FreeImage();
}
unsigned char CBMPLoader::LoadBitmap(char filename)
{
ifstream file;
// Variaveis da windows.h para guardar o cabecalho e informacoes do BMP
BITMAPINFOHEADER bitmapInfoHeader;
BITMAPFILEHEADER header;
//Variavel auxiliar para converter o BGR do BMP pra o RGB do OpenGl ( mais a frente sera feita a conversao )
unsigned char ucConverte = 0;
file.open(filename,ios::binary);
file.read(reinterpret_cast<char*>(&header),sizeof(BITMAPFILEHEADER));
if(header.bfType != BITMAP_ID) {
file.close();
return NULL;
}
file.read(reinterpret_cast<char*>(&bitmapInfoHeader), sizeof(BITMAPINFOHEADER));
iImageWidth = bitmapInfoHeader.biWidth;
iImageHeight = bitmapInfoHeader.biHeight;
if(bitmapInfoHeader.biSizeImage == 0)
bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth *
bitmapInfoHeader.biHeight * 3;
file.seekg(header.bfOffBits);
image = new unsigned char[bitmapInfoHeader.biSizeImage];
if(!image) {
delete[] image;
file.close();
return NULL;
}
file.read(reinterpret_cast<char*>(image),bitmapInfoHeader.biSizeImage);
// conversao de bgr para rgb
for(int iIndex = 0; iIndex < (int)bitmapInfoHeader.biSizeImage; iIndex+=3)
{
ucConverte = image[iIndex];
image[iIndex] = image[iIndex+2];
image[iIndex+2] = ucConverte;
}
file.close();
return image;
}
void CBMPLoader::CreateTexture(int id)
{
textureVec[id] = id;
glBindTexture(GL_TEXTURE_2D, textureVec[id]);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, iImageWidth,
iImageHeight, GL_RGB, GL_UNSIGNED_BYTE,
image);
}
void CBMPLoader::LoadTextureFromBitmap(char *filename,int id)
{
LoadBitmap(filename);
CreateTexture(id);
FreeImage();
}
void CBMPLoader::FreeImage()
{
if(image){
delete[] image;
image = 0;
}
}Carregando comentários...