Teksturowanie sfery w OpenGL

0

Witam,
mam drobny problem z teksturowaniem sfery. O ile nakłada mi jakis materiał który jest cały szary to nie jest to ustawiona przeze mnie tekstura. Co więcej wszystko się ładnie robi dla szescianu jesli podam mu TexCoord. Błąd w przypadku korzystania z mojej tekstury to HEAP CORRUPTION , gdy korzystam z teksturki kolegi błędu NIE MA natomiast tekstury nie widać jest po prostu jest szara powierzchnia rysowanego elementu bryły. Proszę o wskazanie błędu, być może muszę wyznaczać kordy jesli tak to prosze o potwierdzenie.

O to chodzi mi z szarą powierzchnią: user image
Te kuleczki na sstatku które normalnie sąniebieskie po nałożeniu tekstury są szare, właściwie dzieje sie tak z każdą powierzchnią na której dam GL_Enable(GL_TEXTURE_2D)

Funkcja wczytująca teksture (w draw), być może nie powinienem jej tu dawać z sześcianem działa.

Włączenie teksturowania koła.

kolo_goscia(float h)
{
	


	glBegin(GL_POLYGON);
	for (int i = 0; i <= 300; i++){
		double angle = 2 * PI * i / 300;
		double x = cos(angle)*h;
		double y = sin(angle)*h;

		glEnable(GL_TEXTURE_2D);
		glVertex2d(x, y);
		glDisable(GL_TEXTURE_2D);
	}

	glEnd();
} 
unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
	FILE *filePtr;							// wskaŸnik pozycji pliku
	BITMAPFILEHEADER	bitmapFileHeader;		// nag³ówek pliku
	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 udao si przydzieli pami
	if (!bitmapImage)
	{
		free(bitmapImage);
		fclose(filePtr);
		return NULL;
	}

	// wczytuje dane obrazu
	fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);

	// sprawdza, czy dane zostay 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;
	}

	// zamyka plik i zwraca wskaŸnik bufora zawieraj¹cego wczytany obraz
	fclose(filePtr);
	return bitmapImage;
} 
void DrawOpenGLScene()
{
	GLfloat position[4] = { 10.0f, 10.0, 100.0f, 0.0f };

	// flagi czynnosci pomocniczych

	glEnable(GL_DEPTH_TEST);

	// czyszczenie buforow
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//glEnable(GL_CULL_FACE);
	
	glEnable(GL_COLOR_MATERIAL);
	
//	glMaterialf(GL_FRONT, GL_SHININESS, 16.0f);  //blysk

	glGenTextures(1, &texture[0]);                  // tworzy obiekt tekstury			

	// aduje pierwszy obraz tekstury:
	bitmapData = LoadBitmapFile("Bitmapy//v2k.bmp", &bitmapInfoHeader);

	glBindTexture(GL_TEXTURE_2D, texture[0]);       // aktywuje obiekt tekstury
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   /// (pierwszy - na jaka texture oddzialuje),(3 parametr NEAREST LUB LINEAR)
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
	// tworzy obraz tekstury
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, bitmapInfoHeader.biWidth,
		bitmapInfoHeader.biHeight, 0,GL_RGB , GL_UNSIGNED_BYTE, bitmapData);

	if (bitmapData)
		free(bitmapData);

	// ustalenie sposobu mieszania tekstury z tem
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

	auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);

	// wlaczenie oswietlenia
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHTING);

	// transformacja obserwacji
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	// zrobienie zlagodzenia modeli
	glShadeModel(GL_SMOOTH);

	// umiejscowienie kamery w odleglym miejscu
	glTranslatef(pivot_x, pivot_y, -z_dist);
	glRotatef(pivot_vert_angle, 1, 0, 0);
	glRotatef(pivot_horiz_angle, 0, 1, 0);

	glPushMatrix(); //dalej rysuje obiekty niewazne} 

Niesamowicie cięzko mi edytowac post gdyż edycja chodzi strasznie wolno.

//edit fakt podalem kod dla koła a a nie kuli ale problem pozostaje ten sam.

0

Pytanie na klasówkę:

  • jakie funkcje możemy wywoływać w bloku glBegin, glEnd?
    Podpowiedź: na pewno nie glEnable, glDisable.

Tak, coordy powinieneś podawać.
W DrawGLscene ładujesz teksturę na okrągło - gdyby tak kiedykolwiek robiono w grach, to byś sobie nie pograł :P Powinieneś załadować teksturę gdzieś wcześniej, a nie w funkcji rysującej. W funkcji rysującej powinieneś dać tylko glBindTexture, ewentualnie glEnable(GL_TEXTURE_2D);.

0

Ok dziekuje za odpowiedz w takim razie.

Po daniu do WM CREATE teksturka sie tworzy i działą na szescianie ale jesli dam taka z cgtextures ktora ma rozmiary o potedze 2 i zaledwie 120 KB wyskakuje po raz kolejny HEAP CORRUPTION ERROR. Alternatywnie bmp 16, 8 czy 24 b rowniez daja ten błąd.

Kolejny problem to jak wygenerowac texcoord dla sfery chce zmapowac je punktami bez zadnej macierzy. Czy jest do tego jakas funkcja? Na Nehe textures tutorial znalazlem coś dla kwadryk dla macierzy S i Y ale jak to zrobic dla kuli ktora nie jest kwadryka? Szescian dziala z tą prostsza teksturką, ale ze sfera nie mam pojecia jak sie zabrac.

Chodzi mi o ten kod z koordami dla kwadryk:

 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);            // Set The Texture Generation Mode For S To Sphere Mapping ( NEW )
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);            // Set The Texture Generation Mode For T To Sphere Mapping ( NEW )
1

Załaduj teksturę używając picopng:
Dołączani niestandardowych bibliotek do kompilatora/Teksturowanie w OpenGL
Chyba nie muszę wspominać, że trzeba ją skonwertować do PNG?

Nakładać teksturę na kulę możesz według uznania - bo przecież możesz zrobić to tak aby tekstura była rozciągnięta równomiernie, albo żeby była wypukła, czy wklęsła. Podczas obliczania pozycji wierzchołków kuli dostajesz wartości funkcji trygonometrycznych. Użyj ich w texcoordach. One zawsze mają wartości od -1 do 1. W zależności jak chcesz teksturować (czy tekstura ma się zwracać do góry, czy w stronę widza) podajesz do texcoordów wartości funkcji trygonometrycznych używanych w ustaleniu pozycji x, z, albo x, y.

1 użytkowników online, w tym zalogowanych: 0, gości: 1