napisałem baze tekstur i nie działa ta wersja a jest dobre napisana
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#define BITMAP_ID 0x4D42
unsigned char *LoadBitmapFile(char *filename,int &w,int &h)
{
FILE *filePtr; // wskačnik pozycji pliku
BITMAPFILEHEADER bitmapFileHeader; // nag-ˇwek pliku
BITMAPINFOHEADER *bitmapInfoHeader;
unsigned char *bitmapImage; // dane obrazu
int imageIdx = 0; // licznik pikseli
unsigned char tempRGB; // zmienna zamiany sk-adowych
// otwiera plik w trybie "read binary"
filePtr = fopen(filename, "rb");
if (filePtr == NULL)
return NULL;
// wczytuje nag-ˇwek pliku
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
// sprawdza, czy jest to plik formatu BMP
if (bitmapFileHeader.bfType != BITMAP_ID)
{
fclose(filePtr);
return NULL;
}
// wczytuje nag-ˇwek obrazu
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
// ustawia wskačnik pozycji pliku na pocz¦tku danych obrazu
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// przydziela pami੠buforowi obrazu
bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);
// sprawdza, czy uda-o siŕ przydzieliŠ pamiŕŠ
if (!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
return NULL;
}
// wczytuje dane obrazu
fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);
// sprawdza, czy dane zosta-y wczytane
if (bitmapImage == NULL)
{
fclose(filePtr);
return NULL;
}
// zamienia miejscami sk-adowe R i B
for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
w=bitmapInfoHeader->biWidth;
h=bitmapInfoHeader->biHeight;
// zamyka plik i zwraca wskačnik bufora zawieraj¦cego wczytany obraz
fclose(filePtr);
return bitmapImage;
}
class Texture
{
public:
unsigned char *data_image;
int w,h;
void Set(int x,int y,unsigned char *data)
{
w=x;
h=y;
data_image=data;
}
void Free()
{
w=0;
h=0;
delete data_image;
}
};
Texture index[100];
class TextureBase
{
public:
TextureBase();
~TextureBase();
int total;
void Add(char *filename)
{
int w,h;
unsigned char *bdata = LoadBitmapFile(filename,w,h);
index[total].Set(w,h,bdata);
total+=1;
//delete bdata;
}
void unLoad()
{
for(int i=0;i<total;i+=1)
index[i].Free();
total=0;
}
void LoadFile(char *filename)
{
FILE * file;
file = fopen(filename, "rb");
int w,h;
fread(&total,sizeof(total),1,file);
for(int i=0;i<total;i+=1)
{
fread(&w,sizeof(w),1,file);
fread(&h,sizeof(h),1,file);
unsigned char *data=new unsigned char[w*h*3];
fread(data,sizeof(unsigned char),w*h*3,file);
index[i].Set(w,h,data);
}
fclose(file);
}
void SaveToFile(char *filename)
{
FILE * file;
file = fopen(filename, "wb");
fwrite(&total,4,1,file);
for(int i=0;i<total;i+=1)
{
fwrite(&index[i].w,4,1,file);
fwrite(&index[i].h,4,1,file);
int s=index[i].w*index[i].h*3;
fwrite(index[i].data_image,1,s,file);
}
fclose(file);
}
};
TextureBase::TextureBase()
{
total=0;
}
TextureBase::~TextureBase()
{
}
int main(int argc, char* argv[])
{
TextureBase tb;
tb.Add("1.bmp");
tb.Add("2.bmp");
tb.SaveToFile("basetexture.dat");
//tb.unLoad();
// tb.LoadFile("basetexture.dat");
return 0;
}
teraz to samo ale w wydaniu z testami na OpenGl i działa a kurde kod przeklepałem na aplikacje konsoli cały dobrze i nie działa wersja konsolawa o to kod w wersji OpenGl działający
#define WIN32_LEAN_AND_MEAN // "odchudza" aplikację Windows
/*******************************************************************
* Rozdział 8, tekstury - przykład pierwszy
* Autor: Kevin Hawkins
* Wyświetla obracający się sześcian pokryty teksturą.
********************************************************************/
////// Definicje
// identyfikator formatu BMP
////// Pliki nagłówkowe
#include <windows.h> // standardowy plik nagłówkowy Windows
#include <stdio.h> // plik nagłówkowy operacji wejścia i wyjścia
#include <stdlib.h>
#include <gl/gl.h> // standardowy plik nagłówkowy OpenGL
#include <gl/glu.h> // funkcje pomocnicze OpenGL
////// Zmienne globalne
HDC g_HDC; // globalny kontekst urządzenia
bool fullScreen = false; // true = tryb pełnoekranowy;
//false = tryb okienkowy
bool keyPressed[256]; // tablica przyciśnięć klawiszy
float angle = 0.0f; // kąt obrotu
////// Opis tekstury
unsigned int idtexture; // obiekt tekstury
#define BITMAP_ID 0x4D42
// LoadBitmapFile
// opis: ładuje mapę bitową z pliku i zwraca jej adres.
// Wypełnia strukturę nagłówka.
// Nie obsługuje map 8-bitowych.
unsigned char *LoadBitmapFile(char *filename,int &w,int &h)
{
FILE *filePtr; // wskačnik pozycji pliku
BITMAPFILEHEADER bitmapFileHeader; // nag-ˇwek pliku
BITMAPINFOHEADER *bitmapInfoHeader;
unsigned char *bitmapImage; // dane obrazu
int imageIdx = 0; // licznik pikseli
unsigned char tempRGB; // zmienna zamiany sk-adowych
// otwiera plik w trybie "read binary"
filePtr = fopen(filename, "rb");
if (filePtr == NULL)
return NULL;
// wczytuje nag-ˇwek pliku
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
// sprawdza, czy jest to plik formatu BMP
if (bitmapFileHeader.bfType != BITMAP_ID)
{
fclose(filePtr);
return NULL;
}
// wczytuje nag-ˇwek obrazu
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
// ustawia wskačnik pozycji pliku na pocz¦tku danych obrazu
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// przydziela pami੠buforowi obrazu
bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);
// sprawdza, czy uda-o siŕ przydzieliŠ pamiŕŠ
if (!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
return NULL;
}
// wczytuje dane obrazu
fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);
// sprawdza, czy dane zosta-y wczytane
if (bitmapImage == NULL)
{
fclose(filePtr);
return NULL;
}
// zamienia miejscami sk-adowe R i B
for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
w=bitmapInfoHeader->biWidth;
h=bitmapInfoHeader->biHeight;
// zamyka plik i zwraca wskačnik bufora zawieraj¦cego wczytany obraz
fclose(filePtr);
return bitmapImage;
}
class Texture
{
public:
unsigned char *data_image;
int w,h;
void Set(int x,int y,unsigned char *data)
{
w=x;
h=y;
data_image=data;
}
void Free()
{
w=0;
h=0;
delete data_image;
}
};
Texture index[100];
class TextureBase
{
public:
TextureBase();
~TextureBase();
int total;
void Add(char *filename)
{
int w,h;
unsigned char *bdata = LoadBitmapFile(filename,w,h);
index[total].Set(w,h,bdata);
total+=1;
//delete bdata;
}
void unLoad()
{
for(int i=0;i<total;i+=1)
index[i].Free();
total=0;
}
void LoadFile(char *filename)
{
FILE * file;
file = fopen(filename, "rb");
int w,h;
fread(&total,sizeof(total),1,file);
for(int i=0;i<total;i+=1)
{
fread(&w,sizeof(w),1,file);
fread(&h,sizeof(h),1,file);
unsigned char *data=new unsigned char[w*h*3];
fread(data,sizeof(unsigned char),w*h*3,file);
index[i].Set(w,h,data);
}
fclose(file);
}
void SaveToFile(char *filename)
{
FILE * file;
file = fopen(filename, "wb");
fwrite(&total,4,1,file);
for(int i=0;i<total;i+=1)
{
fwrite(&index[i].w,4,1,file);
fwrite(&index[i].h,4,1,file);
int s=index[i].w*index[i].h*3;
fwrite(index[i].data_image,1,s,file);
}
fclose(file);
}
};
TextureBase::TextureBase()
{
total=0;
}
TextureBase::~TextureBase()
{
}
// DrawTextureCube
// opis: rysuje sześcian w podanym położeniu
void DrawTextureCube(float xPos, float yPos, float zPos)
{
glPushMatrix();
glTranslatef(xPos, yPos, zPos);
glBegin(GL_QUADS); // przednia ťciana
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glEnd();
glPopMatrix();
}
// Initialize
// opis: inicjuje OpenGL
void Initialize()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // tło w czarnym kolorze
glShadeModel(GL_SMOOTH); // cieniowanie gładkie
glEnable(GL_DEPTH_TEST); // usuwanie ukrytych powierzchni
glEnable(GL_CULL_FACE); // brak obliczeń dla niewidocznych stron wielokątów
glFrontFace(GL_CCW); // niewidoczne strony posiadają porządek wierzchołków
// przeciwny do kierunku ruchu wskazówek zegara
glEnable(GL_TEXTURE_2D); // włącza tekstury dwuwymiarowe
TextureBase tb;
tb.Add("1.bmp");
tb.Add("2.bmp");
// ładuje obraz tekstury
//tb.SaveToFile("basetexture.dat");
//tb.unLoad();
//tb.LoadFile("basetexture.dat");
glGenTextures(1, &idtexture); // tworzy obiekt tekstury
glBindTexture(GL_TEXTURE_2D, idtexture); // aktywuje obiekt tekstury
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// tworzy obraz tekstury
int i=0;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, index[i].w,
index[i].h, 0, GL_RGB, GL_UNSIGNED_BYTE, index[i].data_image);
}
// Render
// opis: rysuje scenę
void Render()
{
// opróżnia bufor ekranu i bufor głębi
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
angle+=0.1;
DrawTextureCube(0, 0, -5); // rysuje sześcian pokryty teksturą
glFlush();
SwapBuffers(g_HDC); // przełącza bufory
}
// funkcja określająca format pikseli
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat; // indeks formatu pikseli
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // rozmiar struktury
1, // domyślna wersja
PFD_DRAW_TO_WINDOW | // grafika w oknie
PFD_SUPPORT_OPENGL | // grafika OpenGL
PFD_DOUBLEBUFFER, // podwójne buforowanie
PFD_TYPE_RGBA, // tryb kolorów RGBA
32, // 32-bitowy opis kolorów
0, 0, 0, 0, 0, 0, // nie specyfikuje bitów kolorów
0, // bez buforu alfa
0, // nie specyfikuje bitu przesunięcia
0, // bez bufora akumulacji
0, 0, 0, 0, // ignoruje bity akumulacji
128, // 16-bit bufor z
0, // bez bufora powielania
0, // bez buforów pomocniczych
PFD_MAIN_PLANE, // główna płaszczyzna rysowania
0, // zarezerwowane
0, 0, 0 }; // ignoruje maski warstw
nPixelFormat = ChoosePixelFormat(hDC, &pfd); // wybiera najbardziej zgodny format pikseli
SetPixelFormat(hDC, nPixelFormat, &pfd); // określa format pikseli dla danego kontekstu urządzenia
}
// procedura okienkowa
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; // kontekst tworzenia grafiki
static HDC hDC; // kontekst urządzenia
int width, height; // szerokość i wysokość okna
switch(message)
{
case WM_CREATE: // okno jest tworzone
hDC = GetDC(hwnd); // pobiera kontekst urządzenia dla okna
g_HDC = hDC;
SetupPixelFormat(hDC); // wywołuje funkcję określającą format pikseli
// tworzy kontekst tworzenia grafiki i czyni go bieżącym
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
return 0;
break;
case WM_CLOSE: // okno jest zamykane
// deaktywuje bieżący kontekst tworzenia grafiki i usuwa go
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
// wstawia komunikat WM_QUIT do kolejki
PostQuitMessage(0);
return 0;
break;
case WM_SIZE:
height = HIWORD(lParam); // pobiera nowe rozmiary okna
width = LOWORD(lParam);
if (height==0) // unika dzielenia przez 0
{
height=1;
}
glViewport(0, 0, width, height); // reset the viewport to new dimensions
glMatrixMode(GL_PROJECTION); // set projection matrix current matrix
glLoadIdentity(); // reset projection matrix
// wyznacza proporcje obrazu
gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,10.0f);
glMatrixMode(GL_MODELVIEW); // wybiera macierz modelowania
glLoadIdentity(); // resetuje macierz modelowania
return 0;
break;
case WM_MOUSEMOVE:
//x=LOWORD( lParam );
//y=HIWORD( lParam );
//ReleaseDC( hwnd, hDC );
return 0;
break;
case WM_KEYDOWN: // użytkownik nacisnął klawisz?
keyPressed[wParam] = true;
return 0;
break;
case WM_KEYUP:
keyPressed[wParam] = false;
return 0;
break;
default:
break;
}
return (DefWindowProc(hwnd, message, wParam, lParam));
}
// tutaj zaczyna się wykonywanie aplikacji Windows
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX windowClass; // klasa okna
HWND hwnd; // uchwyt okna
MSG msg; // komunikat
bool done; // znacznik zakończenia aplikacji
DWORD dwExStyle; // rozszerzony styl okna
DWORD dwStyle; // styl okna
RECT windowRect;
// zmienne pomocnicze
int width = 1600;
int height = 900;
int bits = 32;
fullScreen = true;
windowRect.left=(long)0; // struktura określająca rozmiary okna
windowRect.right=(long)width;
windowRect.top=(long)0;
windowRect.bottom=(long)height;
// definicja klasy okna
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // domyślna ikona
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // domyślny kursor
windowClass.hbrBackground = NULL; // bez tła
windowClass.lpszMenuName = NULL; // bez menu
windowClass.lpszClassName = "MojaKlasa";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // logo Windows
// rejestruje klasę okna
if (!RegisterClassEx(&windowClass))
return 0;
if (fullScreen) // tryb pełnoekranowy?
{
DEVMODE dmScreenSettings; // tryb urządzenia
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = width; // szerokość ekranu
dmScreenSettings.dmPelsHeight = height; // wysokość ekranu
dmScreenSettings.dmBitsPerPel = bits; // bitów na piksel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
//
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
// przełączenie trybu nie powiodło się, z powrotem tryb okienkowy
MessageBox(NULL, "Przełączenie trybu wyswietlania nie powiodło się", NULL, MB_OK);
fullScreen=FALSE;
}
}
if (fullScreen) // tryb pełnoekranowy?
{
dwExStyle=WS_EX_APPWINDOW; // rozszerzony styl okna
dwStyle=WS_POPUP; // styl okna
//ShowCursor(FALSE); // ukrywa kursor myszy
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // definicja klasy okna
dwStyle=WS_OVERLAPPEDWINDOW; // styl okna
}
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // koryguje rozmiar okna
// tworzy okno
hwnd = CreateWindowEx(NULL, // styl rozszerzony
"MojaKlasa", // nazwa klasy
"Tekstury, przykład pierwszy: obracający się sześcian", // app name
dwStyle | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0, // współrzędne x,y
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top, // szerokość, wysokość
NULL, // uchwyt okna nadrzędnego
NULL, // uchwyt menu
hInstance, // instancja aplikacji
NULL); // no extra params
// sprawdza, czy utworzenie okna nie powiodło się (wtedy wartość hwnd równa NULL)
if (!hwnd)
return 0;
ShowWindow(hwnd, SW_SHOW); // wyświetla okno
UpdateWindow(hwnd); // aktualizuje okno
done = false; // inicjuje zmienną warunku pętli
Initialize(); // inicjuje OpenGL
// pętla przetwarzania komunikatów
while (!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT) // aplikacja otrzymała komunikat WM_QUIT?
{
done = true; // jeśli tak, to kończy działanie
}
else
{
if (keyPressed[VK_ESCAPE])
done = true;
else
{
Render();
TranslateMessage(&msg); // tłumaczy komunikat i umieszcza go w kolejce
DispatchMessage(&msg);
}
}
}
if (fullScreen)
{
ChangeDisplaySettings(NULL,0); // przywraca pulpit
ShowCursor(TRUE); // i wskaźnik myszy
}
return msg.wParam;
}
to są dwie wersje z tym samym systemem pierwsza wersja konsolowa a druga na opengl i wersja konsolowa nie działa