Tesktura png i obsługa przezroczystości.

0

Ładuje tekstur teksturę "alfa.png" z kanałem alfa za pomocą DevIL.
Rysowany jest wtedy czarny kwadrat. Wie ktoś co jest nie tak?

Darmowy hosting zdjęć fotoo.pl

I drugie pytanie jak w OpenGL obsłużyć kanał alfa? Chciałbym aby ta tekstura była przeźroczysta.

Proszę o odpowiedź.

1

Wie ktoś co jest nie tak?

Masz błąd. W kodzie. Mamy zgadywać gdzie? Przeczytaj jakiś tutorial OpenGLa dot. przezroczystości i znajdziesz błąd. Strzelam że nie masz ustawionej jakiejś podstawowej flagi jak GL_BLEND.

Jeśli przeczytałeś tutorial & dalej nie widzisz błędu - wklej kod...

0

Funkcja renderująca scenę:

void Display()
{
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glDisable(GL_COLOR_MATERIAL);

    // wlaczenie teksturowania 
    glDisable(GL_TEXTURE_1D);
    glEnable(GL_TEXTURE_2D);

    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );
   
    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
   
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    /* Poczatek sceny 3D */
    /*
    // ustawienie obserwatora
    gluLookAt( eyex, eyey, eyez, centerx, centery, centerz, 0, 1, 0 );
    
    // kolor krawędzi sześcianu
    glColor3f( 0.0, 0.0, 0.0 );
   
    // początek definicji krawędzi sześcianu
    glBegin( GL_LINES );
   
    // wspólrzędne kolejnych krawędzi sześcianu
    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, - 1.0 );
   
    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, - 1.0 );
   
    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, 1.0 );
   
    glVertex3f( - 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );
   
    glVertex3f( - 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );
   
    glVertex3f( - 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );
   
    glVertex3f( - 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );
   
    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );
   
    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );
   
    // koniec definicji prymitywu
    glEnd();

    // funkacja rysujaca szescian (moja)
    //Prism();
    */
    // Zapisz macierzy rzutowania
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
   
    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();
    
    // wybór macierzy projekcji
    glMatrixMode(GL_PROJECTION);
    // macierz tekstury = macierz jednostkowa
    glLoadIdentity();

    /* Przełączenie w tryb rzutowania ortogonalnego */
    glOrtho(0,width,height,0,-100,100);

    // wybór macierzy modelowania tekstury
    glMatrixMode(GL_TEXTURE);
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    // obrócenie sceny o 40 stopni w osi X i Y
    //glRotated(40, 1.0, 1.0, 0.0);

    /* rysowanie obiektów 2D */
    DrawImage(".\\Graphics\\ABC.png",10,10);
    DrawImage(".\\Graphics\\alfa.png",10,10);

    // powrót do trybu macierzy ModelView
    glMatrixMode (GL_MODELVIEW);

    // powrót starego prespective macierzy rzutowania
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);

    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();
}

A tu funkcja wczytująca grafikę:

int DrawImage(char* Path, int x, int y)
{
	// tworzenie do przechowania tablicy
	ILuint ImgID;

	// pobranie szerokosci obrazu
	ILuint WidthImage = ilGetInteger(IL_IMAGE_WIDTH); 

	// pobranie wysokosci obrazu
	ILuint HeightImage = ilGetInteger(IL_IMAGE_HEIGHT);

	// generowanie nazwy obrazu
	ilGenImages(1, &ImgID); 

	// wybranie biezacego obrazu
	ilBindImage(ImgID);

	// ladowanie obrazu z pliku
	ilLoadImage(Path);

	// obsluga bledow
	if(ilGetError() != IL_NO_ERROR)return ilGetError();

	// generowanie nazwy tekstury
	glGenTextures( 1, & ImgID );

	// wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, ImgID );

	// tworzenie tekstury
	glTexImage2D( GL_TEXTURE_2D, 0, ilGetInteger( IL_IMAGE_BPP ), ilGetInteger( IL_IMAGE_WIDTH ), 
		          ilGetInteger( IL_IMAGE_HEIGHT ), 0, ilGetInteger( IL_IMAGE_FORMAT ), GL_UNSIGNED_BYTE, ilGetData() );

	// ustalenie parametrów tekstury
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

	// ustalenie trybu teksturowania
	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

	// ustalenie koloru kwadratu 
	glColor3f( 0.0, 0.0, 0.0 );

	// rysowanie kwadratu pod teksture
	glBegin( GL_QUADS );

	  glTexCoord2f( 0, 0 );
          glVertex2f( x, y );

          glTexCoord2f( 1, 0 );
          glVertex2f( x + WidthImage, y );

	  glTexCoord2f( 1, 1 );
          glVertex2f( x + WidthImage, y + HeightImage );

	  glTexCoord2f( 0, 1 );
          glVertex2f( x, y + HeightImage );
	glEnd();

	return 1;
}
0

Nie wiem czy to ma znaczenie ale wyświetlam w trybie rzutowania ortogonalnego.

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