Baza tekstur problem

Baza tekstur problem
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

napisałem baze tekstur i nie działa ta wersja a jest dobre napisana

Kopiuj

#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

Kopiuj
#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

edytowany 2x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

g++ tak samo , konsolowa nie działa a wersja z OpenGl działa co jest grane?

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

juz mam znowu te tablice dynamiczne moja literówka i tutaj był błąd, wersja poprawna:

Kopiuj
void Set(int x,int y,unsigned char *data)
	{
		w=x;
		h=y;
		data_image=new unsigned char[w*h*3];
		data_image=data;
	}
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:dzień
  • Postów:427
0

temat zmkniety

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.