Przezroczystość w OpenGL

0

Wczytuje plik *.png z kanałem alfa, który wyświetlam na kwadracie w rzutowaniu ortogonalnym wtedy zamiast przezroczystości jest czerń.
90ns8eg3o8wg_t.jpg
Natomiast w rzucie perspektywicznym jest on zastępowany bielą (poza tym, że jest do góry nogami :) )
j41a5obigr6j_t.jpg
Wniosek z tego takie, że albo nie mam włączonej obsługi przezroczystości w OpenGL albo źle ładuje plik.
Raczej to pierwsze więc jak wyświetlić obraz z przezroczystością?
Proszę o jak najszybszą odpowiedź.

0

Nawet nie starałeś się szukać na google?

0

Obrazek jest OK. Krótka piłka: włączyłeś alpha blending?

0

Oczywiście, że tak od jakiegoś tygodnia (oczywiście ktoś powie, że byle jak skoro nie znalazłem info na temat tak 'oklepanego' tematu - i ma racje) ale cóż.

EDIT:

Obrazek jest OK. Krótka piłka: włączyłeś alpha blending?

... ehkem... chodzi o coś takiego?

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	
glEnable(GL_BLEND);					
glEnable(GL_ALPHA_TEST);

Jeśli tak to tak i to z różnymi kombinacjami.

0

Tak. W ten sposób włączasz przeźroczystość. Możliwe że problem występuje przy ładowaniu pliku.
Upewnij się że ładowane dane mają 4 kanały (GL_RGBA lub GL_BGRA, flaga format jesli używasz glTexImage2D). Pokazałeś mało kodu i ciężko (mi) powiedzieć co jest nie tak.
Proponuje ci skorzystać z b. fajnego toola zwanego gDebugger, nie raz uratował mi życie. Masz tam podgląd wszystkich tekstur używanych przez program. Od razu zobaczysz czy obrazek ma jeden z 2 formatów o których wspomniałem.

0

Ładuje tak:

<code class="cpp">ILuint LoadImage(ILuint & Texture, char *Path)
{
    // generowanie nazwy obrazu
	ilGenImages(1, &Texture); 

	// wybranie biezacego obrazu
	ilBindImage(Texture);

	// ladowanie obrazu z pliku
	ilLoadImage(Path);
	
	// obsluga bledow
	if(ilGetError() != IL_NO_ERROR)return ilGetError();
}

Wyświetlam:

void DrawImage2D(int x, int y, int WidthImage, int HeightImage, ILuint ImgID)
{
	// kasowanie tekstury
	glDeleteTextures(1, & ImgID);

	// 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();

}
void DrawImage3D(int x, int y, int z, int WidthImage, int HeightImage, ILuint ImgID)
{
	// kasowanie tekstury
	glDeleteTextures(1, & ImgID);

	// 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);
      glVertex3f( x, y, z);

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + WidthImage, y, z);

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + WidthImage, y + HeightImage, z);

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y + HeightImage, z);
	glEnd();
}
void DrawPrism(float x, float y, float z, float width, float height, float lenght, ILuint ImgID)
{
	// kasowanie tekstury
	glDeleteTextures(1, & ImgID);

	// 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( 1.0, 1.0, 1.0 );

	glBegin( GL_QUADS );

	  // tylnia sciana
	  glTexCoord2f( 0, 0);
      glVertex3f( x, y, z );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + width, y, z );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + width, y + height, z );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y + height, z );

	  // prawa sciana boczna
	  glTexCoord2f( 0, 0);
      glVertex3f( x + width, y, z );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + width, y, z + lenght );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + width, y + height, z + lenght );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x + width, y + height, z );

	  // lewa sciana boczna
	  glTexCoord2f( 0, 0);
      glVertex3f( x, y, z );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x, y, z + lenght );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x, y + height, z + lenght );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y + height, z );

	  // gorna sciana
	  glTexCoord2f( 0, 0);
      glVertex3f( x, y + height, z );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + width, y + height, z );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + width, y + height, z + lenght );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y + height, z + lenght );

	  // dolna sciana
	  glTexCoord2f( 0, 0);
      glVertex3f( x, y , z );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + width, y , z );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + width, y, z + lenght );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y, z + lenght );

	   // przednia sciana
	  glTexCoord2f( 0, 0);
      glVertex3f( x, y, z + lenght );

	  glTexCoord2f( 1, 0 );
      glVertex3f( x + width, y, z + lenght );

	  glTexCoord2f( 1, 1 );
      glVertex3f( x + width, y + height, z + lenght );

	  glTexCoord2f( 0, 1 );
      glVertex3f( x, y + height, z + lenght );
	glEnd();
}

Funkcja renderująca:

void Display()
{
	// licznie ilosci wygenerowania sceny
	frames++;
    // ladowanie obrazu
	if(LT == 1){LoadTextures();LT = 0;}
	
	// włączenie testu bufora głębokości
    glEnable( GL_DEPTH_TEST );

	// 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 i bufora głębokości
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_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 );
    
	// wylaczenie teksturowanie
	glDisable(GL_TEXTURE_2D);

    // 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();

	// wlaczenie teksturowania
	glEnable(GL_TEXTURE_2D);

	DrawPrism(0,0,0,0.9,0.9,0.3,Texture);

    // 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();

	/* rysowanie obiektów 2D */

	// rysowanie FPS itd.
	if(debug == true)DebugMode();

	//DrawImage2D(10,10,ilGetInteger(IL_IMAGE_WIDTH),ilGetInteger(IL_IMAGE_HEIGHT),Texture);

    // 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();
}

Oczywiście w tej funkcji nie ma włączonego jeszcze mieszania - blendingu.

TUTAJ CAŁY PROJEKT pod Microsoft Visual C++ 2010 Express
http://www.sendspace.pl/file/9d4ddfb489ec065f248484c

0

Włączyłem przezroczystość po dodaniu tego:

// włączenie mieszania
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

i usunięciu tego przy tworzeniu tekstury:

//glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

Teraz przezroczystość działa ale wszystko inne jest czarne.
http://www.sendspace.pl/file/pic/b6bf06814a0189f115f64c9/1

Cały projekt jak by się komuś przydał będzie na hostingu do 29 lipca 2013 lub 31 dni od ostatniego pobrania pliku.
http://www.sendspace.pl/file/9c330937afb7ca549431efd

2

Udało mi się z tą przezroczystością! :)
Nie działało bo miałem źle ustawione parametry tekstur.

*Daje tu paczkę z samymi kodami, plikami *.h i plikami *.dll, .lib może komuś się przyda.

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