[C++] Która linijka w tym kodzie ładuje obraz?


#1

Witam,

mam małe pytanie:

otóż korzystam z tego kodu:

http://r3dux.org/2010/11/single-call-op ... -in-devil/

I tam w linijkach 14-16 jest taki kod:

ilBindImage(imageID); // Bind the image


	success = ilLoadImage(theFileName); // Load the image file

Moje pytanie brzmi: czy w tej chwili program załadował już obrazek do programu?

O co mi chodzi: chcę tą funkcję rozbić na 2 części:

Która wykonuje się na początku i wczytuje tekstury.

Która wykonuje się co klatkę i nakłada tekstury na obiekty.

No i chcę wiedzieć czy ten moment który nie musi powtarzać się cały czas już minął :slight_smile:

Z góry dzięki

Pozdrawiam.


(Wojtekbogocki) #2

Przecież masz tam funkcję odpowiedzialną za wczytywanie tekstury? :wink: Robisz po prostu:

GLuint texture = loadImage("image.png")

A potem renderujesz co chcesz :slight_smile:

Na wypadek gdybym źle zrozumiał pytanie:

Tak wtedy obrazek jest już załadowany pod indeks imageID, ale nie jest to tekstura OpenGL.


#3

Sorry, że dopiero teraz odpowiadam, ale nie do końca o to mi chodziło.

Wiem, że ta funkcja wczytuje obraz ale chciałem ją rozbić na 2 funkcje:

LoadTextures() - wczytywanie obrazka z dysku

BindTextures() - Nakładanie textury na obiekt.

I chodziło mi o to który moment w tej funkcji na stronie odpowiada za załadowanie obrazka z dysku do pamięci.


(Wojtekbogocki) #4

Spoko.

Funkcję ładującą teksturę masz wyżej i ona cała odpowiada za ładowanie tekstury więc tam nie grzeb :slight_smile: Do bindowania tekstury służy glBindTexture(), ale ja w swoim frameworku korzystam z czegoś takiego:

bool BindTexture(GLuint texId)

{

     if(glIsTexture(texId))

     {

          glBindTexture(GL_TEXTURE_2D, texId);

          return true;

     }

     else

          return false;

}

edit.

Ewentualnie jeśli chcesz wiedzieć to za załadowanie obrazka z dysku do pamięci odpowiada ilLoadImage() a za załadowanie danych z obrazka do tekstury OpenGL odpowiada glTexImage2D.


#5

Coś mi nie wychodzi :stuck_out_tongue:

vector < GLuint > Textures::tekstury;

Textures tex;

void Textures::LoadTextures(const char* theFileName, int ID){


	ILuint imageID; //Tworzenie ID obrazka jako ULunit


	GLuint textureID; //Tworzenie ID tekstury jako GLuint


	ILboolean success; //Dzieki tej zmiennej sprawdzimy czy wykonywanie skryptu sie powiodlo


	ILenum error; //Przechowujemy w tym bledy


	ilGenImages(1, &imageID); //Tworzenie Id obrazka


	ilBindImage(imageID); //"Bindowanie" obrazka


	success = ilLoadImage(theFileName); // Load the image file


	if (success)

	{

		ILinfo ImageInfo;

		iluGetImageInfo(&ImageInfo);

		if (ImageInfo.Origin == IL_ORIGIN_UPPER_LEFT)

		{

			iluFlipImage();

		}


		success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);


		if (!success)

		{

			error = ilGetError();

			std::cout << "Image conversion failed - IL reports error: " << error << " - " << iluErrorString(error) << std::endl;

			exit(-1);

		}

	}

	else

  	{

		error = ilGetError();

		std::cout << "Image load failed - IL reports error: " << error << " - " << iluErrorString(error) << std::endl;

		exit(-1);

  	}

	glGenTextures(1, &textureID);


    Textures::tekstury.push_back(textureID);

    ilDeleteImages(1, &imageID); // Poniewa¿ obraz jest ju¿ za³adowany do tekstury, mo¿na zwolniæ pamiêæ zajmuj¹c¹ ten obraz.


}


void Textures::BindTextures(int ID){

    //"Binduj" teksturê do nazwy

		glBindTexture(GL_TEXTURE_2D, tex.tekstury[ID]);


		//Ustaw tekstury metod¹ "powtarzanie"

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);


		// Set texture interpolation method to use linear interpolation (no MIPMAPS)

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


		// Specify the texture specification

		glTexImage2D(GL_TEXTURE_2D, //Typ tekstury

					 0, // Poziom piramid(alny) (?) - 0 jest najwy¿szy

					 ilGetInteger(IL_IMAGE_BPP),	// G³êbokoœæ koloru obrazka

					 ilGetInteger(IL_IMAGE_WIDTH),	// SzerokoϾ

					 ilGetInteger(IL_IMAGE_HEIGHT),	// WysokoϾ

					 0, // Obramowanie (szerokosc w pikselach)

					 ilGetInteger(IL_IMAGE_FORMAT),	// Format obrazka (i.e. RGB, RGBA, BGR etc.)

					 GL_UNSIGNED_BYTE, // Typ danych

					 ilGetData()); // Rzeczywiste dane obrazu


	    std::cout << "Pomyslnie utworzono teksture." << std::endl;

}

Co tu jest źle? Byłbym wdzięczny za poświęcenie chwilki...

tenblad.png

Problem w tym że tekstura jest zupełnie inna :confused:


(Wojtekbogocki) #6

Wiesz co -> skończ z pomysłem rozbijania tej funkcji ładującej na dwie bo to nie ma zwyczajnie sensu. Funkcję która ładuje ci teksturę masz w pierwszym poście, sam podałeś do niej linka. Gdy już taką teksturę załadujesz, OpenGL będzie ją trzymał w pamięci karty graficznej dopóki nie każesz jej usunąć (glDeleteTextures()). Żeby jej użyć/zbindować/ustawić na aktywną wystarczy, że wywołasz funkcję, którą podałem w drugim swoim poście. Przykład kodu:

GLuint tex1 = LoadTexture("image1.png");

GLuint tex2 = LoadTexture("image2.png");

int x = 0;

int y = 0;


BindTexture(tex1);

drawQuad(x, y); // rysujemy 1 prostokąt z nałożoną tex1

drawQuad(x + 25, y + 25); // rysujemy 2 prostokąt z nałożoną tex1


BindTexture(tex2);

drawQuad(x + 50, y + 50); // rysujemy prostokąt z nałożoną tex2


glDeleteTextures(1, &tex2) // usuwamy tekstury

glDeleteTextures(1, &tex1)

Gdzie drawQuad() rysuje po prostu czworokąt. Proste?

Ps.

A tak w ogóle zobacz sobie jeszcze to: http://www.lonesock.net/soil.html, może łatwiej ci się przyswoi, bo to co wyprawiasz z DevIL'em woła o pomstę do nieba.

Tu masz też przykładową klasę reprezentującą teksturę napisaną przy użyciu SOIL'a: http://wklejto.pl/113377. Mam nadzieję, że to ci trochę rozjaśni w głowie.