Wczytuje plik *.png z kanałem alfa, który wyświetlam na kwadracie w rzutowaniu ortogonalnym wtedy zamiast przezroczystości jest czerń.
Natomiast w rzucie perspektywicznym jest on zastępowany bielą (poza tym, że jest do góry nogami :) )
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ź.
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
- Rejestracja:prawie 12 lat
- Ostatnio:ponad 11 lat
- Postów:11
Nawet nie starałeś się szukać na google?
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
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.
- Rejestracja:prawie 17 lat
- Ostatnio:ponad 6 lat
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.
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
Ł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
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
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
- przezroczystosc.PNG (10 KB) - ściągnięć: 154
- Rejestracja:około 12 lat
- Ostatnio:około 7 lat
- Lokalizacja:Tutaj,obok
- Postów:759
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.
- OpenGL - przezroczystosc.rar (1 MB) - ściągnięć: 214
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.
.sdf
i.ipch