Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Powerpaule

Treue Seele

  • »Powerpaule« ist der Autor dieses Themas

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

1

18.03.2008, 16:09

rgb zu rgba [OpenGL]

Also ich hab eine Funktion, die eine Bitmap lädt und in eine Textur umwandelt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void LoadWindowsBitmap2(char *fn)
{
        Graphics::TBitmap *b = new Graphics::TBitmap();
        b->LoadFromFile(fn);
        GLubyte *bmp = new GLubyte[b->Width*b->Height*3];
        for(int i=0;i<b->Width;i++)
        {
                for(int j=0;j<b->Height;j++)
                {

                        int Pixel=b->Canvas->Pixels[i][j];
                        bmp[3*(i*b->Width+j)+0] = GetRValue(Pixel);
                        bmp[3*(i*b->Width+j)+1] = GetGValue(Pixel);
                        bmp[3*(i*b->Width+j)+2] = GetBValue(Pixel);
                }
        }
        glGenTextures(1, &texture[0]);
        glBindTexture(GL_TEXTURE_2D, texture[0]);
        gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,b->Width,b->Height,GL_RGB,GL_UNSIGNED_BYTE,bmp);
        delete b;
        delete bmp;
}


Jetzt möchte ich allerdings auch transparente Pixel haben, also mit ALPHA_TEST Pixel ausblenden.
Dazu muss ich ja GL_RGBA statt GL_RGB verwenden.
Wie kann ich denn die Bitmap so umwandeln, dass ich noch einen Alpha-Kanal hinzufüge? (den würde ich dann beispielsweise aus einer zweiten Bitmap laden)

danke schonmal!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

18.03.2008, 16:31

Mehr Speicher reservieren:

C-/C++-Quelltext

1
GLubyte *bmp = new GLubyte[b->Width*b->Height*4]; 


Und den den Alphakanal mit Werten füllen:

C-/C++-Quelltext

1
2
3
4
bmp[4*(i*b->Width+j)+0] = GetRValue(Pixel);
bmp[4*(i*b->Width+j)+1] = GetGValue(Pixel);
bmp[4*(i*b->Width+j)+2] = GetBValue(Pixel);
bmp[4*(i*b->Width+j)+3] =  255; // Dein Alphawert


Außerdem
@D13_Dreinig

Powerpaule

Treue Seele

  • »Powerpaule« ist der Autor dieses Themas

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

3

18.03.2008, 19:33

Ok, danke, so in der Art dacht ich's mir schon^^

Also jetzt funktioniert zwar die Darstellung der Textur und je nach Alphawert wird's auch mehr oder weniger transparent,
jedoch klappt es nicht dass er einzelne Pixel nicht rendert, bzw. Er rendert entweder alles oder nichts.

die code-zeile, die die textur erstellt:

C-/C++-Quelltext

1
gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,b->Width,b->Height,GL_RGBA,GL_UNSIGNED_BYTE,bmp);


Und dann beim Rendern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
                glEnable(GL_ALPHA_TEST);
                glAlphaFunc(GL_GREATER,0.1);
                glBindTexture(GL_TEXTURE_2D, texture[0]);

                glPushMatrix();
                        glTranslated(0,0,2);
                        glRotated(20,0,1,0);
                        TexturedQuad(v[0],v[1],v[2],v[3]);
                glPopMatrix();
                glDisable(GL_ALPHA_TEST);


Das ist jetzt sehr komisch, wenn ich jetzt den AlphaWert auf 0 stelle, zeichnet er's auch, obwohl er nur bei größer 0.1 zeichnen soll, er zeichnet aber auch wenn ich 255 einstelle.
Stelle ich statt GL_GREATER GL_LESS ein, zeichnet er es garnicht.
Wenn ich verschiedene Alphawerte für die Pixel nehmen, funktioniert das auch nicht anders.

Woran könnte das liegen??[/cpp][/code]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

18.03.2008, 23:40

Sieht eigentlich ok aus. Möglicherweise hast du wo anders einen Fehler im Code.
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

19.03.2008, 08:56

Ich habe keine Ahnung von OGL, aber muss man bei der Funktion glAlphaFunc den Referenz Wert in dem Bereich 0-255 oder 0.0-1.0 angeben?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

19.03.2008, 09:04

Zitat von »"Nox"«

Ich habe keine Ahnung von OGL, aber muss man bei der Funktion glAlphaFunc den Referenz Wert in dem Bereich 0-255 oder 0.0-1.0 angeben?


Werte im Bereich 0-1.
@D13_Dreinig

Powerpaule

Treue Seele

  • »Powerpaule« ist der Autor dieses Themas

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

7

24.03.2008, 13:30

Danke, hab das Problem gefunden:

In dem Beispiel, was ich hatte, wurde die Textur mit

C-/C++-Quelltext

1
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_DECAL);


erzeugt, es muss aber

C-/C++-Quelltext

1
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);


heißen.
(hab ich allerdings nur durch Probieren herausgefunden)

Werbeanzeige