Autor Wątek: C# and TAO openlg - problem z wczytaniem tekstury z PNG.  (Przeczytany 3277 razy)

Offline Tryllion

  • Użytkownik

# Listopad 30, 2008, 20:38:03
Witam
Używam z powodzeniem TAO frameworka do OpenGL owania z C#pem.

Do tej pory teksturowałem wszystko z .bmp , zachciało mi się jednak użyć formatu posiadającego kanał alpha no i nie tak topornego jak bmp.
Padło na png.
Pytanie jest takie dlaczego program  nie wyświetla mi przezroczystych elementów tylko rysuje je na biało.
Kod jest taki:
Bitmap(fileName); Ta część działa z pewnością bo tak wczytana bitmapa zapisana ponownie do innego pliku wygląda tak samo.
A więc problemem jest przekazanie tablicy bajtów obrazu do opengl a.
            textureImage[0] = LoadBMP("NeHe.Lesson06.NeHe.png");               // Load The Bitmap
            // Check For Errors, If Bitmap's Not Found, Quit
            if(textureImage[0] != null) {
                status = true;                                                  // Set The Status To True

                Gl.glGenTextures(3, texture);                                   // Create Three Textures

                textureImage[0].RotateFlip(RotateFlipType.RotateNoneFlipY);     // Flip The Bitmap Along The Y-Axis
                // Rectangle For Locking The Bitmap In Memory
                Rectangle rectangle = new Rectangle(0, 0, textureImage[0].Width, textureImage[0].Height);
                // Get The Bitmap's Pixel Data From The Locked Bitmap
                BitmapData bitmapData = textureImage[0].LockBits(rectangle, ImageLockMode.ReadOnly,[b] PixelFormat.Format24bppRgb[/b]);

                // Create Nearest Filtered Texture
                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture[0]);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, [b]Gl.GL_RGB8[/b], textureImage[0].Width, textureImage[0].Height, 0, [b]Gl.GL_BGR[/b], Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
Myślę że odpowiedzialne za całość są części pogrubione, próbowałem już różnych formatów, kanał alpha dalej jest biały, tzn nie obsługiwany, proszę o pomoc  ??? Jak sprawić aby tekstura uwzględniała alpha kanał .

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Anton Chigurh

  • Użytkownik

# Listopad 30, 2008, 22:00:09
1. zmienić format tekstury na GL_RGA - czyli jak już słusznie zauważyłeś
2. włączyć blending - glEnable(GL_BLEND); oraz tuż przed rysowaniem obiektów glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nie jestem pewien, czy ta para parametrów da satysfakcjonujący Cię rezultat. Poeksperymentuj, pogogluj, powinno pójść jak z płatka ;-).

Offline Tryllion

  • Użytkownik

# Grudzień 01, 2008, 20:58:26
Wielkie dzięki, są postępy, jak już się uporam to wkleje kod.
Googluje googluje i nie bardzo , więc jeszcze raz dzięki.

Offline lardux

  • Użytkownik

# Październik 09, 2009, 10:13:06
czy kolega uporał się z tym wczytywaniem przezroczystego png? bo mam ten sam problem i nie mam pojęcia jak go ugryźć, szukałem nawet bibliotek pod c# wczytujących obrazki, ale raczej bieda w tym temacie

Offline lardux

  • Użytkownik

# Październik 09, 2009, 11:40:23
widze ze licznik odwiedzajacych sie zwieksza, wiec moze wkleje obrazki ilustrujace co sie dzieje

jak mam ladowanie tekstur za pomoca
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, image.Width, image.Height, 0, [b]Gl.GL_BGR_EXT[/b], Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
to widze cos takiego


jesli zmienie kod na
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, image.Width, image.Height, 0, [b]Gl.GL_BGRA_EXT[/b], Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
to widze takie cos



wyswietlam zawsze z wlaczynymi opcjami
            Gl.glEnable(Gl.GL_BLEND);
            Gl.glBlendFunc(Gl.GL_DST_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);

nadmieniam ze jest to plik png i gimp pokazuje ze faktycznie ma przezroczyste literki (tzn same biale litery i nie ma nic czarnego) a kazda literka to osobna tekstura

any idea?

Offline Dab

  • Redaktor
    • blog

# Październik 09, 2009, 15:00:09
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, image.Width, image.Height, 0, Gl.GL_BGRA_EXT, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);

Pogrubienie to wewnętrzny format tekstury. Musi mieć format alpha (GL_RGBA).
Kursywa to format wczytywanych danych. Może być zupełnie inny niż wewnętrzny format tekstury.


[edit]
E... ma dobry format. Trzeba się więcej wysypiać. :P
« Ostatnia zmiana: Październik 09, 2009, 19:15:25 wysłana przez Dab »

Offline Kos

  • Użytkownik
    • kos.gd

# Październik 09, 2009, 18:43:22
Ym...
Cytuj
Gl.glEnable(Gl.GL_BLEND);
Gl.glBlendFunc(Gl.GL_DST_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);

A nie wolałbyś może GL_SRC_ALPHA w pierwszym parametrze?

Offline lardux

  • Użytkownik

# Październik 12, 2009, 09:17:29
niestety zmiana DST na SRC nie pomogla, any other idea?

osobiscie mi sie wydaje ze to moze byc spowodowane wczytywaniem pliku png, ma ktos namiary na dobry loader?

Offline empitness

  • Użytkownik
    • portfolio

# Październik 12, 2009, 09:30:38
Zainteresuj się biblioteką DevIL, jej C#-owy binding jest dołączony do Tao Framework (nawet z przykładami). Nie używałem jej z C#, ale z C++ śmiga aż miło, m.in. z plikami PNG.

Offline lardux

  • Użytkownik

# Październik 12, 2009, 10:15:50
dzieki za info, ale juz sobie poradzilem, mialem jeden blad, lecz potrzebowalem sporo czasu zeby go znalezc, w takich chwilach najlepiej sie przespac, a teraz juz ku potomnosci

metoda ladujaca pliczek i tworzaca teksture

       
                Bitmap image = new Bitmap(sciezka_do_pliku);
                image.RotateFlip(RotateFlipType.RotateNoneFlipY);
                System.Drawing.Imaging.BitmapData bitmapdata;
                Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);

                bitmapdata = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb );

                Gl.glGenTextures(nr, out textura);
                Gl.glBindTexture(Gl.GL_TEXTURE_2D, textura);
                Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, image.Width, image.Height, 0, Gl.GL_BGRA_EXT, Gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);

                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR); // Linear Filtering
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR); // Linear Filtering

                image.UnlockBits(bitmapdata);
                image.Dispose();

wyswietlanie
            Gl.glEnable(Gl.GL_BLEND);
            Gl.glBlendFunc(Gl.GL_DST_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, textura);
            Gl.glCallList(1);